[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2003
    Beiträge
    41

    SQL mit variabler Sortierfolge

    Hallo,

    ich möchte die Sortierfolge der SQL-Abfrage variabel gestallten. Mit einer Hostvariable funktioniert das logischerweise nicht, ob wohl der Compiler das problemlos akzeptiert

    select * from mylib/kunden
    order by :myorderby


    Ich kann auch nicht die Abfrage dynamisch erstellen und dann mit prepare usw. arbeiten, weil ich nicht satzweise lesen will (kann) sondern die Ganze Ausgabe in ein JSON-Object ausgebe. Mein SQL-Statement sieht so aus:
    exec sql
    with kd as (
    select * from ezhqry/kunden
    order by kdnachn asc
    limit :myLimit offset :myOffset)

    select JSON_OBJECT(
    'success' value 'true' format json,
    'errmsg' value ' ',
    'items' value
    JSON_ARRAYAGG(
    JSON_OBJECT(
    'kdid' value kdid,
    'kdnachn' value trim(kdnachn),
    'kdvorn' value trim(kdvorn)
    )
    )
    )
    into :GblJson
    from kd;


    Hat jemand eine Idee/Lösung?
    Danke im Voraus
    Roman

  2. #2
    Registriert seit
    Nov 2004
    Beiträge
    325
    Moin

    geht doch:

    Exec SQL Declare MyCursor Cursor For Select * From MyTable
    Where F1 = : Bedingung
    Order BY
    Case When : OrderBy = '1' then Feld Else NULL End Desc

    dann klappts auch so.

    mfg

    DKSPROFI

  3. #3
    Registriert seit
    Feb 2003
    Beiträge
    41
    Zitat Zitat von DKSPROFI Beitrag anzeigen
    Moin

    geht doch:

    Exec SQL Declare MyCursor Cursor For Select * From MyTable
    Where F1 = : Bedingung
    Order BY
    Case When : OrderBy = '1' then Feld Else NULL End Desc

    dann klappts auch so.

    mfg

    DKSPROFI
    Hallo,

    Vielen Dank für die rasche Antwort. Ich kenne die Syntax mit 'order by case' aber eben in Verwendung mit Cursor. Ich brauche aber keinen Cursor, weil ich ja kein Fetch mache. Ich weiss nicht, wie ich die Syntax in meine Abfrage implementieren kann bzw. ob ich in meiner Abfrage irgendwie mit Cursor arbeiten kann.
    Noch mal vielen Dank
    Roman

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Und alternativ kann man den SQL auch in eine Variable packen und den Order by dann dynamisieren.
    Open/Fetch/Close bleiben dabei identisch.
    Parameter werden mit ? definiert und per Using beim Open/execute angegeben.

    An Stelle des Select Into kann man dann Cursor nehmen oder per "Values (...) into ?" verwenden.

    Übrigens Limit und Offset sind durchaus performancemäßig schlecht. Auch hier bietet sich alternativ ein "Scrollable Cursor" an, der statisch ist, also nur die Daten zum Openzeitpunkt nimmt, oder dynamisch sein kann.
    Dann kann man per Fetch next/fetch prior/fetch relative seine Seitensteuerung durchführen.
    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

  5. #5
    Registriert seit
    Feb 2003
    Beiträge
    41
    Hallo Fuerchau,
    Vielen Dank. Ich habe die Variante mit SQL in Variable packen wohl überlegt, aber meine Ausgabe ist in eine Hostvariable, das funktioniert so nicht. Und ich möchte nicht mit Scrollable cursor arbeiten, weil ich dann auch mit Fetch arbeiten muss dh. Satzweise und das funktioniert mit JSON_* nicht - ich weiss zumindest nicht, wie das gehen soll. Und Dein Einwand bez. Offset und Limit ist natürlich grundsätzlich richtig, allerdings performt das bei mir ausreichend gut und in Verbindung mit JSON-Datenausgabe auch nicht mit Fetch realisierbar. Danke für Deine Unterstützung
    mfg
    Roman

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Statt "Select into " funktioniert ja auch "values ... into ...", und das geht eben auch wieder ohne Cursor.
    "values (select ...) into " klappt auch wieder per execute [immediate] ....
    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

Tags for this Thread

Berechtigungen

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