Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So erhalten Sie Zeilen, deren Spaltenwerte nicht null sind

Ich habe etwas gefunden, aber das bedeutet, CURSOR zu verwenden

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

Lassen Sie mich das ein wenig erklären.

Zuerst erstelle ich einen Cursor, der alle Spalten einer Tabelle durchläuft. Für jede Spalte habe ich ein SQL-Skript erstellt, um in der Tabelle nach Nicht-Null-Werten für die ausgewählte Spalte zu suchen. Für die Zeilen, die die Kriterien erfüllen, nehme ich ihre eindeutige ID und füge sie in eine temporäre Tabelle ein, und diesen Job verwende ich für alle Spalten.

Am Ende sind nur IDs, deren Anzahl der Anzahl der Spalten entspricht, Ihre Ergebnismenge, da nur Zeilen mit identischer Anzahl von Vorkommen wie Anzahl der Spalten in der Tabelle Zeilen mit allen Nicht-Null-Werten in allen Spalten sein können.