View Full Version : SQLRPGLE
Hallo zusammen,
in einem sqlrpgle soll in der Where Bedingung eine
In Abfrgae durchgeführt werden z.B:
C/EXEC SQL
C+ DECLARE
C+ SELECT
C+ FROM
c+ where
c*** laender in ('AU', 'D' , 'NL')
c+ laender in :wk2
Die Variable wk2 enthält folgenden Inhalt
WK2 = '('AU' , 'NL' , 'D') '
Leider klappt die SQL Abfrage nicht.
Kann man keine IN Abfrage mit einer Variablen durchführen ?
Gruss an alle
Michael
So geht das leider nicht. Du musst die Anzahl möglicher Inhalte per Programm bereits vorsehen und mehrere Variablen benennen:
where ... laender in (:vin1, :vin2, :vin3, ...) ...
Hallo Baldur,
okay, vielen Dank das klappt.
Ich habe aber ein Arrary DIM(99) mit den evtl vorkommenden
Länderkürzel. Wobei 1 bis n Elenente gefüllt sein können.
Mal sehen wie man soetwas machen könnte.
Gruss
Michael
Hallo Michael,
hier noch eine etwas unkonventionelle Methode. Du must nur den String entsprechend aufbereiten. Achtung der String sollte mit Komma beginnen und enden:
/Free
String = ',D,E,F,DK,CH,GB,USA,';
/End-Free
C/Exec SQL
C+ Declare .....
C+ Select LAENDER, ....
C+ from MyTable
C+ where :String like '%,' concat TRIM(LAENDER) concat ',%'
C/End-Exec
Wenn ich mich jetzt nicht vertippt habe, sollte es funktionieren. Performancemäßig dürfte es allerdings nicht der Renner sein.
Birgitta
Hallo zusammen,
danke für die Tipps. Ich habe es jetzt so gelöst:
where
laender in ( :wkdst1 , :wkdst2 , :wkdst3, :wkdst4 , :wkdst5 ,
:wkdst6 , :wkdst7 , :wkdst8, :wkdst9 , :wkdst10 ,
:wkdst11, :wkdst12, :wkdst13, :wkdst14 , :wkdst15 ,
:wkdst16, :wkdst17, :wkdst18, :wkdst19 , :wkdst20 ,
:wkdst21, :wkdst22, :wkdst23, :wkdst24 , :wkdst25 ,
:wkdst26, :wkdst27, :wkdst28, :wkdst29 , :wkdst30
)
wobei es dabei egal ist ob ein Wert in den Feldern steht. Die Felder die auf Blank stehen werden wohl ignoriert.
Viele
Grüße
Ignoriert ist falsch !
Solange dein Feld "laender" keine Blanks enthält ist das korrekt.
Ggf. solltest du die nicht benötigten Felder mit *HIVAL initialisieren.
*HIVAL?!
Was aber wenn man auch Sätze hat in denen LAENDER mit *HIVAL belegt sind?
Dann ist die Lösung genauso hinfällig, wie wenn man *Blanks für die nicht initialisierten Elemente verwenden würde!
Deshalb würde ich die nicht belegten Elemente mit dem einem ausgewählten Länder-Kennzeichen (z.B. dem letzten oder dem ersten ausgewählten Wert) auffüllen. Der Optimizer sollte erkennen, dass der gleiche Wert mehrfach angegeben wurde.
Birgitta
Hallo,
ich würde den Variablen die *BLANKS als Inhalt haben einen hexadecimalen Wert zuweisen, einen Wert der keinem Zeichen entspricht.
Damit ist sichergestellt, daß nicht ungewollt Sätze abgerufen werden, die eigentlich nicht gewünscht sind.