AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Select where wert in (...)
Thema durchsuchen
Ansicht
Themen-Optionen

Select where wert in (...)

Ein Thema von Rainer Wolff · begonnen am 27. Jan 2012 · letzter Beitrag vom 27. Jan 2012
Antwort Antwort
Rainer Wolff

Registriert seit: 25. Okt 2005
Ort: Bretten
321 Beiträge
 
Delphi 10.4 Sydney
 
#1

Select where wert in (...)

  Alt 27. Jan 2012, 10:59
Datenbank: Firebird • Version: 2.5 • Zugriff über: dbx
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Select where wert in (...)

  Alt 27. Jan 2012, 11:02
Nein, geht nur durch dynamischen Zusammenbau (z:b. als Codeblock oder SP)
Markus Kinzler
  Mit Zitat antworten Zitat
alex517

Registriert seit: 23. Nov 2004
Ort: Bernau b. Berlin
273 Beiträge
 
Delphi XE5 Enterprise
 
#3

AW: Select where wert in (...)

  Alt 27. Jan 2012, 12:21
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.
Alexander
  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:29 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