Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Select where wert in (...) (https://www.delphipraxis.net/166052-select-where-wert.html)

Rainer Wolff 27. Jan 2012 09:59

Datenbank: Firebird • Version: 2.5 • Zugriff über: dbx

Select where wert in (...)
 
Hallo,

ich habe grad erfolglos über folgendes Problem gegrübelt und gesucht:

Ich möchte ein SQL-Statement der Form "Select * from table where spalte in (1,2,3,4)".
Diese Bedingung (1,2,3,4) möchte ich allerdings als dynamischen Parameter haben, also quasi
"Select * from table where spalte in (:menge)"

Klar kann ich mir den SQL-String selbst zusammenbauen, ich möchte aber wissen, ob es auch eine Syntax gibt um zu sagen: Query.Parambyname('menge').AsIrgendwas=Menge.

Gruß Rainer

mkinzler 27. Jan 2012 10:02

AW: Select where wert in (...)
 
Nein, geht nur durch dynamischen Zusammenbau (z:b. als Codeblock oder SP)

alex517 27. Jan 2012 11:21

AW: Select where wert in (...)
 
Hi,

So was könnte man z.B. mit einer SP machen.


SQL-Code:

create or alter procedure SP_DECODE_LIST (
  ALIST DOM_MEMO,
  ADELIMITER DOM_CHAR1)
returns (
  ITEM DOM_VCHAR100)
AS
DECLARE VARIABLE I INTEGER;
begin
  IF (ADelimiter is NULL) THEN
    ADelimiter = ',';

  ALIST = COALESCE(ALIST, '');
  ITEM = NULL;

  IF (CHAR_LENGTH(ALIST) > 0) THEN
  BEGIN
    WHILE (CHAR_LENGTH(ALIST) > 0) DO
    BEGIN
 
      I = POSITION(ADELIMITER IN ALIST);
      IF (I = 0) THEN
        I = CHAR_LENGTH(ALIST) +1;

      ITEM = F_TRIM(LEFT(ALIST, I-1));
      suspend;

      ALIST = SUBSTRING(ALIST FROM I + 1 FOR CHAR_LENGTH(ALIST));
    END

  END ELSE
    suspend; -- einmal NULL
end

die Query würde dann so aussehen
SQL-Code:


  select
    L.ITEM,
    R.*
  from
    SP_DECODE_LIST(:Menge, ',') L
    join MyTable R on (R.ID = L.ITEM)


und im Delphi übergibst du die Liste dem Parameter als Commatext

Delphi-Quellcode:

  MeineQuery.ParamByName('Menge').AsString := '222,223,224,225,226,227';

ps.
Vor dem Erstellen der SP müssen die Domains "DOM_MEMO" als Blob Typ 1 und "DOM_CHAR1 und "DOM_VCHAR100" wie der Name schon sagt definiert werden.
Oder halt direkt den Typ angeben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:35 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