Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Parameter für ein SQL Abfrage mit IN (https://www.delphipraxis.net/216567-parameter-fuer-ein-sql-abfrage-mit.html)

ggscholz 19. Jan 2025 01:34

Datenbank: Postgresql • Version: 17 • Zugriff über: unidac

Parameter für ein SQL Abfrage mit IN
 
Hallo in die Runde,

in eier PSQL DB Frage ich Daten über dBeaver ab:
Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (1,3)
Die Werte (hier 1,3 = Wert 1 und Wert 3) übergebe ich in Delphi als Paramter
Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (:p0,:p1)
Mal wird mit nur einem Parameter angefragt, mal auch mit 2 oder mehr. Daher wäre ein Paramter, den ich flexibel füllen könnte mein Favorit.

In Delphi könnte ich den Text
Code:
1,3
daher auch an nur einen Parameter übergeben, so das ich die Menge der Werte flexibel halten kann.

Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (:p0);
q.params[0].AsString := '1,3' ;
Dann wird aber der Text 1,3 als eins komma drei interpreiert.

Gibt es eine Möglichkeit, die beiden Werte 1 und 3 so formatiert an einen Parameter zu übergeben, das die Werte in der SQL Abfrage richtig interpretiert werden.

Grüße gerd

Delphi.Narium 19. Jan 2025 02:22

AW: Parameter für ein SQL Abfrage mit IN
 
Nein, je Wert ein Parameter, aber nicht ein Parameter für mehrere Werte.

Wieviele Werte musst Du maximal abdecken können?

Wenn das klar und eindeutig definiert ist, dann fülle die Parameter von links nach rechts mit den abzufragenden Werten und für die verbleibenden Werte nimmst Du immer den letzten Wert.

Sinngemäß sowas in der Art:
SQL-Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9)
In Delphi sinngemäß sowas:
Delphi-Quellcode:
  Parameter[0].Value := 0;
  Parameter[1].Value := 1;
  Parameter[2].Value := 2;
  Parameter[3].Value := 3;
  Parameter[4].Value := 3;
  Parameter[5].Value := 3;
  Parameter[6].Value := 3;
  Parameter[7].Value := 3;
  Parameter[8].Value := 3;
  Parameter[9].Value := 3;
Ergäbe dann ein
SQL-Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (0, 1, 2, 3, 3, 3, 3, 3, 3, 3)
Unelegant, ist bei 'ner IN-Klausel aber ok, aber in der Flexibilität immer begrenzt.

Alternative:

Eine temporäre Tabelle bauen, sowas in der Art:
SQL-Code:
create table InWerte (Wert integer not null);

Diese Tabelle mit den abzufragenden Werte befüllen und das Abfrage-SQL anpassen.
SQL-Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (select wert from InWerte)
Bei diesem Konstrukt kannst Du 1:n Werte abfragen. Bei einer über Konstanten oder Parameter zusammengebauten Abfrage, ist die Menge der Werte (datenbankabhängig) begrenzt.

Anschließend das Leeren der Tabelle InWerte nicht vergessen.

hes 19. Jan 2025 07:10

AW: Parameter für ein SQL Abfrage mit IN
 
Zitat:

Zitat von ggscholz (Beitrag 1545388)
Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (1,3)

Nimmst du kein FireDAC bei Delphi? Lese unidac, haben die so was nicht? ZEOS haben seit der Version 6 leider keine Macros mehr, oder ich hätte es in den 8ern übersehen.
In deinem FDQuery in Delphi steht:
Code:
 select count(w.warehouseid) as total
 from warehouse w
 where w.locationid IN (&inwerte)
In Delphi schreibst:
Code:
 FDQuery1.MacroByName('inwerte').AsRaw := '1,3';
...oder...
Code:
  FDQuery1.MacroByName('inwerte').AsRaw := '1,3,5';
Wie findest das?

Frickler 20. Jan 2025 12:40

AW: Parameter für ein SQL Abfrage mit IN
 
Zitat:

Zitat von hes (Beitrag 1545390)
Nimmst du kein FireDAC bei Delphi?

FireDAC erzwingt die Enterprise Version von Delphi. Nicht jeder will oder kann das ausgeben. Mit UniDAC kommt man da elegant drumrum. Und auch UniDAC kennt Macros: https://docs.devart.com/unidac/work_macros.htm

Redeemer 20. Jan 2025 13:53

AW: Parameter für ein SQL Abfrage mit IN
 
Zitat:

Zitat von hes (Beitrag 1545390)
AsRaw

Wieso überhaupt escapen? Kann ich mir dann doch gleich schenken.

himitsu 20. Jan 2025 14:07

AW: Parameter für ein SQL Abfrage mit IN
 
Zitat:

Zitat von ggscholz (Beitrag 1545388)
SQL-Code:
select
   count(w.warehouseid) as total
   from
   warehouse w
   where
   w.locationid IN (:p0);
q.params[0].AsString := '1,3' ;

Eintweder als &Makro, nicht als :Parameter
oder den Parameter im SQL "splitten" (string to array ODER to rows)

Papaschlumpf73 20. Jan 2025 15:02

AW: Parameter für ein SQL Abfrage mit IN
 
Vorab: Ich habe keine Ahnung von PostgreSQL.... Beim Microsoft SQL-Server benutze ich dafür einen Parameter vom Typ nvarchar(max), in dem ich einen JSON-String mit den Einzelwerten übergebe. Auf dem SQL-Server lasse ich dann den Parameter mit OPENJSON wieder auseinander fummeln. Ggf. kann ja PostgreSQL auch gut mit JSON-Strings umgehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:46 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz