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.


Anmelden zum Antworten