Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment obtenir des lignes dont les valeurs de colonnes ne sont pas nulles

J'ai trouvé quelque chose, mais cela signifie utiliser 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

Laissez-moi vous expliquer un peu.

Je crée d'abord un curseur qui parcourt toutes les colonnes d'une table. Pour chaque colonne, j'ai créé un script sql pour rechercher dans le tableau des valeurs non nulles pour la colonne sélectionnée. Pour les lignes qui satisfont aux critères, je prends son ID unique et le mets dans la table temporaire, et ce travail que j'utilise pour toutes les colonnes.

À la fin, seuls les ID dont le nombre est comme le nombre de colonnes sont votre ensemble de résultats, car seules les lignes qui ont un nombre identique d'apparitions comme le nombre de colonnes dans le tableau peuvent être des lignes avec toutes les valeurs non nulles dans toutes les colonnes.