Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como obter linhas cujos valores de colunas não são nulos


Encontrei algo, mas isso significa usar 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

Deixe-me explicar isso um pouco.

Primeiro eu crio um cursor que itera por todas as colunas de uma tabela. Para cada coluna, criei um script sql para pesquisar na tabela valores não nulos para a coluna selecionada. Para as linhas que atendem aos critérios, pego seu ID exclusivo e coloco na tabela temporária, e esse trabalho estou usando para todas as colunas.

No final, apenas os IDs cuja contagem é como a contagem de colunas são seu conjunto de resultados, porque apenas as linhas que têm número idêntico de aparências como número de colunas na tabela podem ser linhas com todos os valores não nulos em todas as colunas.