![]() |
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:
Die Werte (hier 1,3 = Wert 1 und Wert 3) übergebe ich in Delphi als Paramter
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (1,3)
Code:
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.
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (:p0,:p1) In Delphi könnte ich den Text
Code:
daher auch an nur einen Parameter übergeben, so das ich die Menge der Werte flexibel halten kann.
1,3
Code:
Dann wird aber der Text 1,3 als eins komma drei interpreiert.
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (:p0); q.params[0].AsString := '1,3' ; 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 |
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:
In Delphi sinngemäß sowas:
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (:p0, :p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9)
Delphi-Quellcode:
Ergäbe dann ein
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;
SQL-Code:
Unelegant, ist bei 'ner IN-Klausel aber ok, aber in der Flexibilität immer begrenzt.
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (0, 1, 2, 3, 3, 3, 3, 3, 3, 3) 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:
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.
select
count(w.warehouseid) as total from warehouse w where w.locationid IN (select wert from InWerte) Anschließend das Leeren der Tabelle InWerte nicht vergessen. |
AW: Parameter für ein SQL Abfrage mit IN
Zitat:
In deinem FDQuery in Delphi steht:
Code:
In Delphi schreibst:
select count(w.warehouseid) as total
from warehouse w where w.locationid IN (&inwerte)
Code:
...oder...
FDQuery1.MacroByName('inwerte').AsRaw := '1,3';
Code:
Wie findest das?
FDQuery1.MacroByName('inwerte').AsRaw := '1,3,5';
|
AW: Parameter für ein SQL Abfrage mit IN
Zitat:
![]() |
AW: Parameter für ein SQL Abfrage mit IN
Zitat:
|
AW: Parameter für ein SQL Abfrage mit IN
Zitat:
oder den Parameter im SQL "splitten" (string to array ODER to rows) |
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