Mysql
 sql >> Database >  >> RDS >> Mysql

Come ottenere righe i cui valori di colonne non sono null

Ho trovato qualcosa, ma questo significa usare 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

Lascia che ti spieghi un po'.

Per prima cosa creo un cursore che scorre tutte le colonne di una tabella. Per ogni colonna, ho creato uno script sql per cercare nella tabella valori non nulli per la colonna selezionata. Per quelle righe che soddisfano i criteri, prendo il suo ID univoco e inserisco la tabella temporanea, e questo lavoro sto usando per tutte le colonne.

Alla fine solo gli ID che contano come il conteggio delle colonne sono il tuo set di risultati, perché solo le righe che hanno lo stesso numero di aspetti come il numero di colonne nella tabella possono essere righe con tutti i valori non nulli in tutte le colonne.