Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Select IN Abfrage mit Parameter ? (https://www.delphipraxis.net/171299-sql-select-abfrage-mit-parameter.html)

user0815 30. Okt 2012 12:41

Datenbank: Firebird • Version: 2.5.1 • Zugriff über: UniDAC

SQL Select IN Abfrage mit Parameter ?
 
Delphi-Quellcode:
  SQL.Clear;
  SQL.Add('SELECT');
  SQL.Add(' FELD1, FELD2, DATUM');
  SQL.Add('WHERE');
  SQL.Add(' FELD1 IN (1,2,3,4,5,6,7,8,9) AND');
  SQL.Add(' DATUM >= :DATE1');
  SQL.Add('ORDER BY');
  SQL.Add(' FELD1 DESC');

  ParamCheck := true;
  ParamByName('DATE1').AsDateTime:= StartOfTheDay(DateTimePicker1.Date);
Frage: Kann man für die FELD1 IN Abfrage auch mit Parametern arbeiten, & wenn ja wie ?

Grüße
user0815

Medium 30. Okt 2012 12:42

AW: SQL Select IN Abfrage mit Parameter ?
 
"...IN (:p00, :p01, :p02, :p03, ...)" geht bei MySQL zumindest prima.

mkinzler 30. Okt 2012 13:00

AW: SQL Select IN Abfrage mit Parameter ?
 
Ich vermute mal er meint aber ein Parameter für die Liste. Und das geht bei den mir bekannten DBMS nicht.

user0815 30. Okt 2012 13:06

AW: SQL Select IN Abfrage mit Parameter ?
 
Schade + Danke !

Also ne Parameter Schleife für die Werte 'bauen', ....

himitsu 30. Okt 2012 13:11

AW: SQL Select IN Abfrage mit Parameter ?
 
Geht denn sowas?
Delphi-Quellcode:
  SQL.Clear;
  SQL.Add('SELECT');
  SQL.Add(' FELD1, FELD2, DATUM');
  SQL.Add('WHERE');
  SQL.Add(' FELD1 IN (&liste) AND');
  SQL.Add(' DATUM >= :DATE1');
  SQL.Add('ORDER BY');
  SQL.Add(' FELD1 DESC');

  ParamCheck := true;
  ParamByName('DATE1').AsDateTime:= StartOfTheDay(DateTimePicker1.Date);
  MakroByName('DATE1').Value:= ':p0,:p1,:p2,:p3';
  ParamByName('p0').AsIrgendwas:= ...;
  ParamByName('p1').AsIrgendwas:= ...;
Den String für das Makro müßte man berechnen lassen, oder, wenn's mit Makro nicht geht, dann StringReplace oder so, direkt ins SQL.Text
Ohne das Makro hatte ich sowas mal verwendet. :oops:

Medium 30. Okt 2012 13:12

AW: SQL Select IN Abfrage mit Parameter ?
 
Die Frage war nach Parametern. Ich kenne auch kein DBMS, dass einen Listentypen in dieser Weise unterstützen würde. Man könnte sich ansonsten noch ggf. über eine temporäre Tabelle helfen, die man dann joined. Dann müsste man diese befüllen statt String-Gewurschtel, klingt üppiger, gefiele mir aber grad bei variabler Anzahl der Listenitems irgendwie besser.

alex517 30. Okt 2012 13:28

AW: SQL Select IN Abfrage mit Parameter ?
 
ich mach das mit einer SP

Parameterliste für where .. IN (..)

alex

Union 30. Okt 2012 14:31

AW: SQL Select IN Abfrage mit Parameter ?
 
Du könntest auch eine temporäre Tabelle verwenden:
Code:
WHERE FELD1 IN (SELECT FELD1 FROM #Temp)

mikhal 31. Okt 2012 10:29

AW: SQL Select IN Abfrage mit Parameter ?
 
Bei den UniDACs gibt es die Möglichkeit Macros in deinem Statement unterzubringen. Damit kann man auch eine Parameterliste sauber übergeben. Ist in der Hilfe gut beschrieben.

Grüße
Mikhal

user0815 31. Okt 2012 10:53

AW: SQL Select IN Abfrage mit Parameter ?
 
DANKE !
In der Hilfe gefunden, ausprobiert, funktioniert.

Zitat:

Working with Macros
Macros help you to change SQL statements dynamically. They allow partial replacement of the query statement by user-defined text. Macros are identified by their names which are then referred from SQL statement to replace their occurrences for associated values.
First step is to assign macros with their names and values to a dataset object.
Then modify SQL statement to include macro names into desired insertion points. Prefix each name with & ("at") sign to let UniDAC discriminate them at parse time. Resolved SQL statement will hold macro values instead of their names but at the right places of their occurrences. For example, having the following statement with the TableName macro name:

SELECT * FROM &TableName

You may later assign any actual table name to the macro value property leaving your SQL statement intact.

Query1.SQL.Text := 'SELECT * FROM &TableName';
Query1.MacroByName('TableName').Value := 'Dept';
Query1.Open;

UniDAC replaces all macro names with their values and sends SQL statement to the server when SQL execution is requested.

Delphi-Quellcode:
  SQL.Clear;
  SQL.Add('SELECT');
  SQL.Add(' FELD1, FELD2, DATUM');
  SQL.Add('WHERE');
  SQL.Add(' FELD1 IN (&Feldwerte) AND');
  SQL.Add(' DATUM >= :DATE1');
  SQL.Add('ORDER BY');
  SQL.Add(' FELD1 DESC');

  ParamCheck := true;
  ParamByName('DATE1').AsDateTime:= StartOfTheDay(DateTimePicker1.Date);
  MacroByName('Feldwerte').Value := '1,2,3,4,5,6,7,8,9';

tsteinmaurer 31. Okt 2012 12:16

AW: SQL Select IN Abfrage mit Parameter ?
 
Hallo,

ich weiss ja nicht, wie lange diese Liste werden kann, aber Firebird hat hier diesbzgl. im IN, wenn es sich um eine Liste von Konstanten hat, ein Limit bei ca. 1500 Elementen.

Nur zur Info.

user0815 31. Okt 2012 12:32

AW: SQL Select IN Abfrage mit Parameter ?
 
Zitat:

ein Limit bei ca. 1500 Elementen
im Extremfall kann die Liste 1999 Einträge haben, bei 2k wären alle selektiert & ich baue die SQL Anweisung anders auf.

Im Bsp. steht FELD1 für User über die eine Auswertung gefahren werden soll, diese sind über eine ChecklistBox auswählbar. In der ChecklistBox habe ich beim Füllen der Namen gleich über AddObject auch den Key mit ausgegeben, zur Ausführung gehe ich also die Liste durch und packe die Selektierten in einen String für die SQL Abfrage.

Ich denke ich werde es trotz der Beschränkung erstmal darauf ankommen lassen, mehr als 1k halte ich schon für unrealistisch... ansonsten muss ich mich dann nochmal damit Beschäftigen.

alex517 31. Okt 2012 13:15

AW: SQL Select IN Abfrage mit Parameter ?
 
Zitat:

ein Limit bei ca. 1500 Elementen
mit meiner Variante über die "SP_DECODE_LIST()"
bzw. mit einer temporären Tabelle wie von Union vorgeschlagen
hast die diese Beschränkung nicht.

alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.

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