sql >> Databasteknik >  >> RDS >> Mysql

Hur man får rader vars kolumnvärden inte är null

Jag hittade något, men det betyder att jag använder CURSOR

DECLARE @ColumnName VARCHAR(200)
DECLARE @ColumnCount INT
DECLARE @sql VARCHAR(400)

CREATE TABLE #tempTable (Id INT)

DECLARE GetNonNullRows CURSOR 
FOR 
    SELECT c.NAME, (SELECT COUNT(*) FROM sys.columns col WHERE col.object_id = c.OBJECT_ID)  FROM sys.tables AS t
    JOIN sys.columns AS c ON t.object_id = c.object_id
    WHERE t.name = 'SomeTable' AND t.type = 'U'

OPEN GetNonNullRows
FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = 'SELECT st.UniqueId FROM SomeTable AS st WHERE ' + CONVERT(varchar, @ColumnName) + ' IS NOT NULL'    
    INSERT INTO #tempTable
    EXEC (@sql)

FETCH NEXT FROM GetNonNullRows INTO @ColumnName, @ColumnCount
END 

CLOSE GetNonNullRows
DEALLOCATE GetNonNullRows

SELECT * FROM SomeTable AS st1
WHERE st1.UniqueId IN (SELECT Id FROM #tempTable AS tt
GROUP BY Id
HAVING COUNT(Id) = @ColumnCount)


DROP TABLE #tempTable

Låt mig förklara detta lite.

Först skapar jag markören som itererar genom alla kolumner i en tabell. För varje kolumn har jag skapat sql-skript för att söka i tabellen efter inte null-värden för den valda kolumnen. För de rader som uppfyller kriterierna tar jag dess unika ID och lägger in en temptabell, och det här jobbet använder jag för alla kolumner.

I slutet är endast ID:n som är som kolumner som räknas som din resultatuppsättning, eftersom endast rader som har identiskt antal visningar som antalet kolumner i tabellen kan vara rader med alla icke-nullvärden i alla kolumner.



  1. Migrera från MySql till SQL Server 2008

  2. Oracle 11g:Ta bort flera kolumner och inkludera kolumnnamn

  3. Jag har problem med att ändra storlek på bilden i blob-kolumnen i Oracle 12c

  4. Varför används avgränsare med lagrad procedur i mysql?