[NEWSboard IBMi Forum]

Thema: SQL if exists

  1. #1
    Registriert seit
    Jun 2009
    Beiträge
    316

    SQL if exists

    IF EXISTS (SELECT MANDKZ2 FROM DMANDKZ2 WHERE MANDKZ2 = 'DEBID' AND MANDKZW2 = ' ' AND DSGLOEKZ <> 'L') then
    .....
    ELSE
    .....
    end if

    Diese Abfrage funktioniert nicht, wenn ich sie direkt im STRSQL eingebe.
    Was muss ich tun, damit sie funktioniert?
    In Prozeduren funktioniert sie!

    Vielen Dank für die Antworten.

    Viele Grüße
    Dschainers

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Was hat das mit SQL zu tun?
    Korrektes SQL ist:

    select bla
    from blub
    where exists (select * from blubblub where blub.bla = blublub.bla)

    Zu beachten ist der "*" im Exists, da die Felder nicht relevant sind für die Existenzprüfung.
    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

  3. #3
    Registriert seit
    Jun 2009
    Beiträge
    316
    OK vielen Dank

    Grüße
    Dschainers

  4. #4
    Registriert seit
    Jun 2009
    Beiträge
    316
    Ich wollte eigentlich wissen ob "if exists" im STRSQL funktioniert oder ob ich dafür eine Prozedur anlegen muss.
    Auf dem Microsoft SQL Server kann ich "if exists" einfach mal eingeben und es funktioniert.

  5. #5
    Registriert seit
    Jun 2009
    Beiträge
    316
    Wir haben nämlich bei uns SQL Server Experten, die sagen daß die Abfrage

    SELECT COUNT(*) FROM D_FWABUS WHERE MANDKENN LIKE 'EW1%'

    durch eine Abfrage

    IF EXISTS(SELECT MANDKENN FROM D_FWABUS WHERE MANDKENN LIKE 'EW1%')
    SELECT 1
    ELSE
    SELECT 0


    ersetzt werden soll, da die 2te Abfrage viel schneller ist.

    Jetzt wollte ich dies mit STRSQL auf der AS400 ausprobieren, leider funktioniert dies dort nicht

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Count(*) zählt auch alles ab und bei vielen Sätzen, ohne entsprechenden (Encoded) Vector Index, kann das schon dauern!
    Wenn Du nur wissen willst, ob ein Satz vorhanden ist oder nicht, solltest Du mit FETCH FIRST ROW ONLY oder LIMIT (ist im Übrigen SQL Standard!) oder mit EXISTS (wie Baldur erklärt hat) oder mit Values() arbeiten:

    Code:
    Select 1
       from D_FWABUS
       Where MANDKENN like 'EWI%'
    Fetch First Row Only;
    Und wenn Du unbedingt ein "IF" haben willst, kannst Du die Abfrage auch so machen:
    Code:
    Values(Case When (SELECT 1 FROM D_FWABUS WHERE MANDKENN LIKE 'EW1%' Fetch First Row Only) = 1 
                Then 1 
                else 0 End);
    Es ist allerdings zu beachten, dass SQL Server keine Db2 for i ist und die Datenbanken unterschiedlich optimieren. Der Query Optimizer auf der i kann durch die Kommunikation mit dem Statistics Manager und weil die Statistiken auch immer aktuell sind, auch die Summe relativ fix ermitteln.

    ... und dann solltest Du Tests nicht (mehr) mit STRSQL, sondern mit ACS machen!

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Wobei es bei ACS keinen Unterschied im SQL zu STRSQL gibt.
    Microsoft SQL-Server war und ist immer schon was besonderes und hat halt viele Non-SQL-Erweiterungen, die mit SQL-Standard nur wenig bis gar nichts zu tun hat.
    Somit lassen sich SQL-Server SQL's häufig gar nicht auf die DB2 for i anwenden.

    SQL-Server:
    select current date;

    DB2:
    values(current date)

    SQL-Server:
    select bla into newtable
    from oldtable where ...

    db2:
    create table newtable as
    (select * from oldtable)
    with data

    usw. usf.
    Und das Allerschlimmste: SQL-Server ist ein schlechterer Optimierer als unsere DB2 und macht grundsätzlich "pessimistische" Locks.
    Letzteres bedeutet:
    Solange eine "Select xxx" nicht beendet ist, also alle Daten abgerufen sind, sind alle betroffenen Tabellen insgesamt gegen veränderungen gesperrt.
    Das selbe gilt für alle Update/Delete/Inserts. Diese sperren die Tabellen bis ein Commit/Rollback durchgeführt wird.
    Dadurch erklären sich auch manche seltsamen SQL-Konstrukte dieser DB.
    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
    Jun 2009
    Beiträge
    316
    Vielen Dank an Birgitta

    Grüße
    Dschainers

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.644
    Zitat Zitat von Dschainers Beitrag anzeigen
    Wir haben nämlich bei uns SQL Server Experten
    Wie können (Microsoft) SQL-Server-Experten wissen, wie eine IBM i tickt? Ansonsten siehe Biggi.

    Und -> in modernen Zeiten iACS nehmen, es kann sein, daß STRSQL nicht bei allen Spielarten von SQL mitspielt.
    www.RZKH.de
    IBM Champion 2022, 2023, 2024
    IBM i Community Advocate https://www.youracclaim.com/badges/6...c-7ad4ba147af6
    Common / CEAC
    http://pub400.com

  10. #10
    Registriert seit
    Jun 2009
    Beiträge
    316
    Unser Programmpaket muss sowohl am SQL Server als auf auf der AS400 DB lauffähig sein.
    Jetzt haben sich unsere SQL Server Experten neue SQL Anweisungen ausgedacht, diese können leider nicht 1:1 auf der AS400 umgesetzt werden.
    Deshalb meine Anfrage hier.

    Jetzt ist erstmal alles gut.
    Der Fall ist erledigt.

    Viele Grüße
    Dschainers

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das ist eher eine seltsame Anforderung. Da kann man sich nur auf den KGN (kleinsten gemeinsamen Nenner) einigen. Dies scheitert schon häufig an den Feldtypen, z.B. DateTime bzw. DateTime2 gibts auf der DB2 nicht sowie viele Funktionen die sich rund um das Datum bewegen sind im SQL-Server komplett anders gelöst.
    Alternativ geht das dann allerding über verschiedene SQL's, die je nach DB spezifisch aufgerufen werden.
    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

Berechtigungen

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