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

Sådan får du rækker, hvis kolonneværdier ikke er nul

Jeg fandt noget, men det betyder at bruge 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

Lad mig forklare dette lidt.

Først opretter jeg en markør, som itererer gennem alle kolonnerne i en tabel. For hver kolonne har jeg oprettet sql-script til at søge i tabel efter ikke-null-værdier for den valgte kolonne. For de rækker, der opfylder kriterierne, tager jeg dens unikke ID og indsætter en midlertidig tabel, og dette job bruger jeg til alle kolonner.

I slutningen er det kun id'er, der tæller som kolonner, der tæller, der er dit resultatsæt, fordi kun rækker, der har identiske antal visninger, såsom antallet af kolonner i tabellen, kan være rækker med alle ikke-nullværdier i alle kolonner.



  1. Importer filstørrelsesgrænse i PHPMyAdmin

  2. Flytning af postgresql-dataklynge

  3. SQL Server Parallel Backup Restore -2

  4. MySQL vælg rækker, hvor venstre join er nul