Geht das irgendwie anders ??
Hängt ein wenig von der Datenmenge ab, geht aber immer auch anders (ich hab mal die params P genannt)
1. bei kleineren Datenmengen so
Code:
Select Feld3 From Tab
Where
(Feld1=:P1) And
(:P2 containing ';'||Feld2||';' )
dabei musst du dann einfach deinen Parameter P2 als semikolon getrennte Liste mit führendem und abschliessendem
Semikolon als String übergeben, z.B. so
Code:
qry.Params[0].AsInteger := 123;
qry.Params[1].AsString := ';a;b;x;';
Das sollte klappen, ist aber von der Performance nur für kleine Datenmenge sinnvoll, weil es garantiert einen
Full Table Scan macht
2. Je nach Netzwerkspeed und Anzahl an Parametern sollte man die Vorteile von prepare nicht überschätzen
und einfach den kompletten
SQL so wie du den brauchst mit konstanten im
SQL Text übertragen , d.h.
Code:
Select Feld3 From Tab
Where
(Feld1=123) And
(Feld2 in ('a','b','x') )
3. Die optimalere Lösungs ggf auch für große Datenmenge
Erstelle eine Global Temporary Table mit on commit delete rows wo nur mögliche Parameter
reinkommen, Index anlegen ggf nicht vergessen
und packe deine Parameter in die Tabelle
Code:
CREATE GLOBAL TEMPORARY TABLE BRPARRAY (
VAL VARCHAR(80) NOT NULL PRIMARY KEY
) ON COMMIT DELETE ROWS;
commit;
INSERT INTO BRPARRAY VALUES ('a');
INSERT INTO BRPARRAY VALUES ('b');
INSERT INTO BRPARRAY VALUES ('x');
--achtung hier kein commit, sonst ist wegen on commit delete rows die tabelle wieder leer
Select Feld3 From Tab
join brparray on brparray.val=tab.feld2
Where
(Feld1=123)
In der Global Temporary Table GTT siehst du immer nur die Daten deiner eigenen Connection.
Mit on commit delete rows ist die nach dem commit leer
Mit on commit preserve rows ist die auch nach dem commit noch gefüllt, dann ggf einfach
selber entscheiden wann gelöscht werden soll.
Wir nutzen GTT zB dafür, das beim Programmstart die Userrechte und Translations einmalig
ausgelesen werden und immer in den GTTs drin sind, man also bei jeder Abfrage zB PLZ
Werte entsprechend der eigenen Rechte da drin zu haben und jede Abfrage kann immer an
eine oder mehrere passende GTTs gejoint werden.