[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2002
    Beiträge
    164

    case in sql where statement

    hallo Leute,
    kann mir jemand die Syntax sagen, wenn ich in sql-select
    ein "where" bzw. "and" Statement mit case bedingen möchte.
    ich dachte:

    select * from datei
    where feld_a = 'xy'
    and case when feld_b <> ' '
    then feld_b = 'abc'
    end

    Also feld_b sollte nur gefiltert werden, wenn es
    ungleich blank ist.

    Vielen Dank

  2. #2
    cbe is offline [professional_User]
    Registriert seit
    May 2005
    Beiträge
    392
    wie wäre es mit sowas wie:

    select * from datei
    where feld_a = 'xy'
    and (feld_b=' ' or feld_b = 'abc')

    Gruß
    Christian

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Also für diesen Fall ist case unsinnig:

    select * from datei
    where feld_a = 'xy'
    and feld_b <> ' '

    Case im Where sieht dann eher so aus (auch wenn es hier wieder unsinnig ist):

    where case when feld <> ' ' then 'ABC' else 'XYZ' end = 'ABC'
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    104
    Ich habe "CASE myfield is NULL then ... ENDCASE" und ähnliches oft benutzt, wenn Datensätze mit LEFT OUTER JOIN verknüpft wurden und nicht sicher war, daß die Felder im rechten Segment überhaupt gefüllt waren. Die Sätze mit NULL-en können nämlich nicht anders abgefragt werden. Das ist besonders bei Datumsfeldern problematisch ...

    Außerdem habe ich in diesen Fällen oft Ersatzwerte für die NULL-Felder erzeugt. Da sehe ich überhaupt den Hauptzweck von CASE. Die CASE-Clause steht dann also an der Position eines selektierten Feldes. Sie muß natürlich immer einen Wert liefern, und ggf. mit OTHERWISE abgesichert werden.

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    @UFK

    Hierfür bietet sich die einfache Funktion "value()" bzw. "coalesce()" an.

    value(Field1, Field2, ...) <= AS/400-spezifisch
    coalesce(Field1, Field2, ...) <= SQL-konform

    Die Funktion liefert das 1. Feld, dass nicht NULL ist.
    Gerade bei "left join" genau die Lösung an Stelle von "CASE ...".

    Beispiel:

    coalesce(MyField, 'Default')
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Apr 2005
    Beiträge
    104
    Gut, "coalesce" ist für diesen Fall wohl passender.

    Nochmal zurück zum CASE: ich habe, so glaube ich, CASE auch benutzt um Kennzeichen für komplizierte kombinierte aufgezählte Bedingungen zu bilden, Kennzeichen, die dann in jeden selektierten Datensatz aufgenommen werden. Bei Verwendung von WHERE kann ich Sätze zwar sehr gut selektieren, muß die nicht selektierten Sätze aber oft ein zweites und drittes Mal selektieren, um sie dann noch irgendwie berücksichtigen zu können. Und diese einzelnen Selektionen müßte ich dann mit UNION ALL wieder zusammenführen. Ok, das geht alles, aber ein CASE ist oft viel praktischer.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Case ist auch bei Group-By sehr schön zu verwenden, da im Group auch Ausdrücke erlaubt sind:

    select firma, werk,
    case
    when kdnr between 1000 and 2000 then 'A'
    when kdnr between 2001 and 5000 then 'B'
    else 'C'
    end as KDGRP
    , sum(Umsatz)
    from myfile
    where ...
    group by Firma, Werk,
    case
    when kdnr between 1000 and 2000 then 'A'
    when kdnr between 2001 and 5000 then 'B'
    else 'C'
    end
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Feb 2002
    Beiträge
    164

    Vielen Dank,

    liebe Leute,

    die Anweisung läuft bereits wie geschmiert.

Similar Threads

  1. SQL Case von mehreren Dateien
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 08-08-06, 09:34
  2. Cobol-Programm mit Embedded SQL (SELECT CASE)
    By klausgkv in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 08-06-06, 13:47
  3. SQL EXISTS Abfrage ausserhalb WHERE
    By mwithake in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 05-11-05, 09:15
  4. SQL Statement
    By juergenkemeter in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 15-11-04, 12:15
  5. SQL Statement
    By Pia in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 18-04-02, 15:24

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •