MSSQL Abfrage mit abgestuften Bedingungen
-
Hi,
ich möchte eine Abfrage für eine Tabelle erstellen, die vier Spalten hat: ID, A, B, Value.
In dieser Tabelle sind Werte gespeichert, die bestimmten Eigenschaften A und B zugeordnet sind. Gilt ein Wert für alle A oder B, wird in der entsprechenden Spalte NULL eingetragen, ansonsten eine entsprechende Nummer.
In meiner Abfrage möchte ich nun alle Einträge haben, die meinem ausgewählten A und B entsprechen. Sollte es für einen Eintrag das gewählte A oder B nicht geben, soll stattdessen der Eintrag mit NULL geladen werden. Soweit bin ich bisher:DECLARE @A int; DECLARE @B int; SET @A = 5; SET @B = 11; SELECT * FROM Tbl WHERE A = @A AND B = @B UNION SELECT * FROM Tbl WHERE A IS NULL AND B = @B UNION SELECT * FROM Tbl WHERE A = @A AND B IS NULL UNION SELECT * FROM Tbl WHERE A IS NULL AND B IS NULL
Gibt es nun für einen Eintrag (zu erkennen an der ID) aber eine "Default"-Wert (A=NULL, B=NULL) und einen Wert für meine Asuwahl von A und/oder B, taucht diese ID mehrmals in meinem Resultset auf.
Wie kann ich das verhindern? Also dass jedes neue UNION nur noch Einträge lädt, deren ID nicht bereits durch vorherige Abfragen erfasst wurden?
-
Lass das mit den Union
SELECT * FROM Tbl WHERE (A = @A OR A IS NULL) AND (B = @B OR B IS NULL)
-
Vergiss das vorherige Sql ,es würde nur das selbe Ergebnis nur ohne union ausgeben
-
Ich habe noch mal über dein Problem nachgedacht.Das sollte funktionieren:
DECLARE @A int; DECLARE @B int; SET @A = 5; SET @B = 11; SELECT * FROM Tbl WHERE A = @A AND B = @B UNION SELECT * FROM Tbl WHERE A IS NULL AND B = @B AND NOT Id IN ( SELECT Id FROM Tbl WHERE A = @A AND B = @B ) UNION SELECT * FROM Tbl WHERE A = @A AND B IS NULL AND NOT Id IN ( SELECT Id FROM Tbl WHERE A IS NULL AND B = @B AND NOT Id IN ( SELECT Id FROM Tbl WHERE A = @A AND B = @B ) ) UNION SELECT * FROM Tbl WHERE A IS NULL AND B IS NULL AND NOT Id IN ( SELECT Id FROM Tbl WHERE A = @A AND B IS NULL AND NOT Id IN ( SELECT Id FROM Tbl WHERE A IS NULL AND B = @B AND NOT Id IN ( SELECT Id FROM Tbl WHERE A = @A AND B = @B ) ) )
-
@heimchen:
Worum geht's denn eigentlich?
Willst du wie in deinem Beispiel nur ein einzelnes Ergebnis raussuchen? Dann wäre es doch ziemlich egal, dass du mehrere Resultate bekommst - kannst das Ergebniss ja mit ORDER BY passend sortieren, und mit TOP 1 die erste Zeile holen.Oder du machst halt mit IF und 4 getrennten SELECT.
Oder brauchst du vielleicht doch viele verschiedene Werte auf einmal? In dem Fall würde ich nen Temp-Table bzw. ne Table-Variable nehmen, und da iterativ mit UPDATE ... SET Value = ... WHERE Value IS NULL die Werte reinschreiben.