2013-01-23 6 views
9

Ich versuche eine Abfrage zu erstellen, die alle Zeilen zurückgibt, die einen Nullwert für alle bis auf eine Spalte haben. Einige Zeilen haben irgendwo mehr als einen Nulleintrag. Es gibt eine Spalte, die ich ausschließen möchte, da zu diesem Zeitpunkt alle Einträge null sind und es sich um die einzige Spalte handelt, die Nullwerte haben darf. Ich stehe fest, weil ich nicht weiß, wie man alle Spalten in die WHERE einbezieht.Alle Zeilen mit Nullwert (en) in beliebiger Spalte finden

SELECT * 
FROM Analytics 
WHERE * IS NULL 

Alternativ kann ich eine Zählung für eine Spalte, aber die Tabelle etwa 67 Spalten.

SELECT COUNT(*) 
FROM Analytics 
WHERE P_Id IS NULL 
+0

Sie müssen es manuell tun. Sie müssen alle Spalten auflisten. Sie können dies mit TSQL generieren und ausführen, indem Sie das Tabellenschema nachschlagen und dann TSQL generieren, das alle 67 Spalten auflistet. Aber es gibt keine einfache Möglichkeit, Werte für mehrere Spalten in einer einzelnen Anweisung zu überprüfen, wie z. B. "* IS NULL" –

+5

Welche RDBMS und Version verwenden Sie? – Lamak

+0

Dies ist SQLServer 2005: '[. Ich dachte, ich müsste es vielleicht einzeln machen. –

Antwort

8

In SQL Server Sie die Idee von this answer

;WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as ns) 
SELECT * 
FROM Analytics 
WHERE (SELECT Analytics.* 
     FOR xml path('row'), elements xsinil, type 
     ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0 
ausleihen können

SQL Fiddle

wahrscheinlich eine Abfrage konstruieren mit 67 Spalten wird effizienter sein aber es spart ein wenig Tipparbeit oder benötigt für dynamisches SQL, um es zu generieren.

0

Je nachdem, welche RDBMS Sie verwenden, glaube ich, die einzige Möglichkeit (und nicht explizit sagen WHERE col1 IS NULL and col2 IS NULL and col3 IS NULL ...) Dynamische SQL zu verwenden wäre.

Zum Beispiel, wenn Sie alle Spaltennamen aus einer SQL Server-Datenbank erhalten möchten, können Sie so etwas wie dieses verwenden, um die Namen zurückzukehren:

SELECT 
    name 
FROM 
    sys.columns 
WHERE 
    object_id = OBJECT_ID('DB.Schema.Table') 

Sie FOR XML Ihre WHERE-Klausel erstellen verwenden könnte :

SELECT Name + ' IS NULL AND ' AS [text()] 
FROM sys.columns c1 
WHERE  object_id = OBJECT_ID('DB.Schema.Table') 
ORDER BY Name 
FOR XML PATH('') 

Hoffe, das hilft Ihnen beim Einstieg.

Viel Glück.

+0

Ich habe darüber nachgedacht, aber können Sie die Ergebnisse in einen einzigen temporären Tisch bringen? –

0

Ich habe keine solche Tabelle zu testen, vorausgesetzt, es gibt keine 'x' als Daten in einem beliebigen Feld, ich denke, das sollte funktionieren Sql-Server; (DEMO)

HINWEIS: Ich habe KeyColumn als c.name != 'keyColumn' gefiltert

DECLARE @S NVARCHAR(max), @Columns VARCHAR(50), @Table VARCHAR(50) 

SELECT @Columns = '66', --Number of cols without keyColumn 
     @Table = 'myTable' 

SELECT @S = ISNULL(@S+'+ ','') + 'isnull(convert(nvarchar, ' + c.name + '),''x'')' 
FROM sys.all_columns c 
WHERE c.object_id = OBJECT_ID(@Table) AND c.name != 'keyColumn' 

exec('select * from '[email protected]+' where ' + @S + '= replicate(''x'',' + @Columns + ')') 
Verwandte Themen