1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

CASE in where Bedingung

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von JudAD, 5 Dezember 2018.

  1. JudAD

    JudAD Fleissiger Benutzer

    Hallo Zusammen,

    ich stehe mal wieder auf dem Schlauch und finde keine Lösung.

    Ich muss für eine Auswertung ein Script erstellen dass bis auf den letzten Teil in Fett ganz gut funktioniert.

    Die Bedingungen im ersten Teil der where-Klausel werden dynamisch vom Programm geliefert. In Abhängigkeit von der Bedingung "beas_ftapl.pos_id =" sollen nur bestimmte Datensätze angezeigt werden.

    Ist die Bedingung beas_ftapl.pos_id = 10 dann sollen alle Datensätze angezeigt werden die im Feld "beas_ftstl.aplanpos_id" entweder eine 10 oder NULL stehen haben. Ist die Bedingung z.B. beas_ftapl.pos_id = 20 (oder ein Wert != 10) dann dürfen nur Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id eine 20 (oder die entsprechende Zahl != 10) stehen haben.

    select beas_ftstl.belnr_id, beas_ftstl.belpos_id, beas_ftapl.pos_id, beas_ftpos.itemcode, beas_ftstl.art1_id, oitm.ItemName, beas_ftstl.aplanpos_id
    from beas_ftstl
    join beas_ftpos on beas_ftstl.belnr_id = beas_ftpos.belnr_id and beas_ftstl.belpos_id = beas_ftpos.belpos_id
    join beas_ftapl on beas_ftstl.belnr_id = beas_ftapl.belnr_id and beas_ftstl.belpos_id = beas_ftapl.belpos_id
    join oitm on beas_ftstl.art1_id = oitm.ItemCode
    where beas_ftstl.belnr_id = '113019' and beas_ftstl.belpos_id = '10' and beas_ftapl.pos_id = '10'
    and (beas_ftstl.aplanpos_id =
    case
    when beas_ftapl.pos_id = '10' then (NULL or '10')
    else beas_ftapl.pos_id
    end)

    Wie könnte ich das lösen?

    Danke vorab
     
  2. akretschmer

    akretschmer Datenbank-Guru

    hilft das?

    Code:
    andreas@[local]:5434/test# select * from judad;
     id | f1 | f2
    ----+----+----
      1 |  1 |  1
      2 | 10 |  1
      3 | 10 |   
      4 | 10 | 10
      5 | 20 | 15
      6 | 20 | 20
    (6 rows)
    
    andreas@[local]:5434/test# select * from judad where case when f1 = 10 then case when f2 = 10 or f2 is null then true else false end when f1 = 20 then case when f2 = 20 then true else false end end;
     id | f1 | f2
    ----+----+----
      3 | 10 |   
      4 | 10 | 10
      6 | 20 | 20
    (3 rows)
    
    andreas@[local]:5434/test#
    
     
  3. JudAD

    JudAD Fleissiger Benutzer

    Hi, und erst mal Danke für Deine Mühe. Ich werde es am Wochenende prüfen und gebe Bescheid.
     
  4. JudAD

    JudAD Fleissiger Benutzer

    Erst einmal ein gutes neues Jahr.

    Musste leider andere Projekte vorziehen.

    Habe jetzt mal Deine Lösung angesehen - aber irgendwie kann ich das nicht für meine Zwecke auflösen. Ich möchte eigentlich wenn in Deinem Beispiel f1 = 10 ist dass nur Datensätze ausgegeben werden, bei denen f2 den Wert 10 oder null hat (Sprich Datensätze 3 & 4). Ist f1 ungleich 10 (f1 != 10) dann soll er nur Datensätze anzeigen wo f1 = f2 ist.
     
  5. akretschmer

    akretschmer Datenbank-Guru

    also würde da noch id=1 fehlen?

    Code:
    test=*# select * from judad where case when f1 = 10 then case when f2 = 10 or f2 is null then true else false end when f1 != 100 then case when f2 = f1 then true else false end end;
     id | f1 | f2
    ----+----+----
      1 |  1 |  1
      3 | 10 |   
      4 | 10 | 10
      6 | 20 | 20
    (4 rows)
    
     
  6. JudAD

    JudAD Fleissiger Benutzer

    Hi & danke für die schnelle Reaktion!

    Sorry, ich versuche es nochmals etwas genauer zu erläutern. Wenn f1 = 10 dann dürfen ausschließlich die die Datensätze 3 & 4 ausgegeben werden. Wenn f1 = 20 (oder jede ander Zahl ungleich 10) darf ausschließlich der Datensatz ausgegben werden bei denen f1=f2 ist und bei diesem Besipiel f2 = 20 ist (sprich ausschließlich der Datensatz 6). Ich gebe den f1 Wert dynamisch vor und möchte nur die Datrensätze bei denen der f2 Wert = dem f1 Wert aus der Vorgabe entspricht (außer f1 = 10 - dann müssen alle Datensätze ausgegben werden bei denen f1 = 10 und f2 = 10 oder null ist)

    wenn f1 = 10 >> f2 = 10 oder null
    wenn f1 = 20 >> f2 = 20
    wenn f1 = 30 >> f2 = 30
    wenn f1 = 40 >> f2 = 40
    wenn f1 = 1 >> f2 = 1
    wenn f1 = 90 >> f2 = 90
     
  7. Tommi

    Tommi Datenbank-Guru

    Hallo JudAD,

    was spricht gegen die Zeile

    Code:
    AND beas_ftstl.aplanpos_id = ISNULL(beas_ftapl.pos_id , 10)
    
    ??

    Viele Grüße,
    Tommi
     
  8. JudAD

    JudAD Fleissiger Benutzer

    Ahhh schaut plausibel aus. Werde ich gleich testen ;-)
     
  9. JudAD

    JudAD Fleissiger Benutzer

    Fast, aber leider nicht ganz ;-)
    Das Problem ist, dass dann alle beas_ftstl.aplanpos_id die den Wert NULL haben nicht ausgegeben werden. Hatte sich aber auf den ersten Blick gut angefühlt.
     
  10. Tommi

    Tommi Datenbank-Guru

    Hallo JudAD,

    ein wenig Transformations-Leistung hilft hier: Ich habe anscheinend die Spalten vertauscht.
    Mit dem ISNULL wird definiert, welchen Wert ich annehme, wenn in der Spalte ein NULL auftaucht.
    Dass kann ich für die Abgleich-Spalte wiederholen.
    Dann sieht die Zeile so aus:

    Code:
    AND ISNULL(beas_ftstl.aplanpos_id, 10) = ISNULL(beas_ftapl.pos_id , 10)
    
    Wenn die Bedingung für die Spalte "beas_ftapl.pos_id" nicht gilt oder hier kein NULL zu erwarten ist, muss man das ISNULL natürlich wieder entfernen.

    Gruß,
    Tommi
     
  11. JudAD

    JudAD Fleissiger Benutzer

    Hi Tommi,

    Danke nochmals für Deine Mühe.

    Ich kenne zwar die Funktion ISNULL() aber das Feld beas_ftapl.pos_id wird nie NULL. Ich weiß auch nicht mehr wie ich es klarer definieren soll. Der Wert von beas_ftapl.pos_id wird als Parameter/Filter aus dem Programm übergeben. Sprich, bekomme ich vom Programm für das Feld beas_ftapl.pos_id den den Wert 10, dann sollen nur die Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id den Wert NULL oder 10 haben. Bekomme ich für das Feld beas_ftapl.pos_id den den Wert 20 (oder jede x-beliebige Zahl ungleich 10), dann sollen nur die Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id den Wert 20 haben (oder den x-beliebigen Wert der vom Programm für das Feld beas_ftapl.pos_id übergeben wird)
     
  12. Tommi

    Tommi Datenbank-Guru

    Hallo JudAD,

    wenn Feld beas_ftapl.pos_id nicht NULL werden kann, muss der Fall auch nicht abgefangen werden, wie oben beschrieben.
    Wie ich es verstanden habe, kann in der Spalte "beas_ftstl.aplanpos_id" aber ein NULL vorkommen, was dann dem Wert "10" entspricht.

    Der Filter sieht dann, wie oben schon beschrieben, so aus:

    Code:
    AND ISNULL(beas_ftstl.aplanpos_id, 10) = beas_ftapl.pos_id
    
    Bedeutet, dass der Wert NULL in der Spalte "beas_ftstl.aplanpos_id" mit dem Wert "10" ersetzt wird.
    Der Vergleich ist für den Wert "10" in Spalte "beas_ftapl.pos_id" dann "true", wenn in der Spalte "beas_ftstl.aplanpos_id" der Wert "10" eingetragen ist. Der Wert "NULL" in der Spalte "beas_ftstl.aplanpos_id" wird ja ebenfalls durch den Wert "10" ersetzt und damit stimmt der Abgleich auch für diesen Fall.

    Viele Grüße,
    Tommi
     
  13. JudAD

    JudAD Fleissiger Benutzer

    Yeah ;-)

    Werde es noch mit anderen Werten testen - aber das war es glaube ich.

    Danke erst einmal. Werde gleich noch bereichten ob alle anderen Werte auch funktioneren.
     
  14. JudAD

    JudAD Fleissiger Benutzer

    SUPER - klappt alles - danke!!!
     
    Zuletzt von einem Moderator bearbeitet: 9 Januar 2019
    Tommi gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden