AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Parameter für ein SQL Abfrage mit IN
Thema durchsuchen
Ansicht
Themen-Optionen

Parameter für ein SQL Abfrage mit IN

Ein Thema von ggscholz · begonnen am 19. Jan 2025 · letzter Beitrag vom 20. Jan 2025
Antwort Antwort
ggscholz

Registriert seit: 20. Nov 2013
Ort: Aachen
76 Beiträge
 
Delphi 11 Alexandria
 
#1

Parameter für ein SQL Abfrage mit IN

  Alt 19. Jan 2025, 02:34
Datenbank: Postgresql • Version: 17 • Zugriff über: unidac
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
Gerd

Geändert von ggscholz (19. Jan 2025 um 02:38 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.524 Beiträge
 
Delphi 7 Professional
 
#2

AW: Parameter für ein SQL Abfrage mit IN

  Alt 19. Jan 2025, 03:22
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: 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.
  Mit Zitat antworten Zitat
hes

Registriert seit: 21. Apr 2024
Ort: Baden Württemberg
19 Beiträge
 
Delphi 12 Athens
 
#3

AW: Parameter für ein SQL Abfrage mit IN

  Alt 19. Jan 2025, 08:10
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?
Rainer

Geändert von hes (19. Jan 2025 um 11:26 Uhr)
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
602 Beiträge
 
Delphi XE6 Enterprise
 
#4

AW: Parameter für ein SQL Abfrage mit IN

  Alt Gestern, 13:40
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
  Mit Zitat antworten Zitat
Redeemer

Registriert seit: 19. Jan 2009
Ort: Kirchlinteln (LK Verden)
1.103 Beiträge
 
Delphi 2009 Professional
 
#5

AW: Parameter für ein SQL Abfrage mit IN

  Alt Gestern, 14:53
Wieso überhaupt escapen? Kann ich mir dann doch gleich schenken.
Janni
2005 PE, 2009 PA, XE2 PA
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.210 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parameter für ein SQL Abfrage mit IN

  Alt Gestern, 15:07
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)
$2B or not $2B
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
443 Beiträge
 
Delphi 12 Athens
 
#7

AW: Parameter für ein SQL Abfrage mit IN

  Alt Gestern, 16:02
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:59 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 by Thomas Breitkreuz