sql >> Database >  >> RDS >> Mysql

Hoe rijen te krijgen waarvan de kolomwaarden niet null zijn

Ik heb iets gevonden, maar dat betekent dat ik CURSOR . moet gebruiken

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

Laat me dit een beetje uitleggen.

Eerst maak ik een cursor die door alle kolommen van een tabel loopt. Voor elke kolom heb ik een sql-script gemaakt om in de tabel te zoeken naar niet-null-waarden voor de geselecteerde kolom. Voor die rijen die aan de criteria voldoen, neem ik de unieke ID en plaats deze in de tijdelijke tabel, en deze taak gebruik ik voor alle kolommen.

Aan het einde zijn alleen ID's waarvan het aantal gelijk is aan het aantal kolommen, uw resultatenset, omdat alleen rijen met een identiek aantal weergaven, zoals het aantal kolommen in de tabel, rijen kunnen zijn met alle niet-null-waarden in alle kolommen.



  1. Hoe te repareren "Conversie mislukt bij het converteren van de waarde naar gegevenstype" in SQL Server

  2. vind de verstreken tijd tussen twee datums in orakel sql

  3. Arrays van meerdere uploadformulieren, afbeeldingen uploaden en vervolgens in de database invoegen (PHP, MySQL)

  4. JOIN (SELECT ... ) ue ON 1=1?