sql >> Databáze >  >> RDS >> Mysql

Jak získat řádky, jejichž hodnoty sloupců nejsou null

Něco jsem našel, ale to znamená použít 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

Dovolte mi to trochu vysvětlit.

Nejprve vytvořím kurzor, který iteruje všechny sloupce jedné tabulky. Pro každý sloupec jsem vytvořil sql skript pro vyhledávání v tabulce pro nenulové hodnoty pro vybraný sloupec. Pro ty řádky, které splňují kritéria, vezmu jejich jedinečné ID a vložím je do dočasné tabulky a tuto úlohu používám pro všechny sloupce.

Na konci jsou vaší výslednou sadou pouze ID, jejichž počet je jako počet sloupců, protože pouze řádky, které mají stejný počet zobrazení jako počet sloupců v tabulce, mohou být řádky se všemi nenulovými hodnotami ve všech sloupcích.



  1. Nejlepší datový typ pro uložení dlouhého čísla vyrobeného z 0 a 1

  2. Propojení třetí tabulky s tabulkou mostu v asociaci mnoho k mnoha

  3. Vnořené funkce okna v SQL

  4. Stáhněte si csv z codeigniter mysql