Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL Where mit Stringbereich (https://www.delphipraxis.net/186269-sql-where-mit-stringbereich.html)

waldforest 19. Aug 2015 07:53

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

SQL Where mit Stringbereich
 
Hallo,
ich möchte gerne eine Abfrage über einen Bereich von Strings durchführen.

z.B. beginnt eine Artikel-Inventarkürzel mit Buchstaben A - K, gefolgt von weiteren Chars.

Nun möchte ich z.B. alle Artikel mit Inventarkürzel AAB bis BAC auflisten. Hierzu gehören z.B. AAB2, AAB3, AAB4 .....

Aktuell habe ich versucht dies über
Delphi-Quellcode:
WHERE
     A.ART_INV >= '+QuotedStr(TRIM(edt_InvStart.Text)+'%')
 AND A.ART_INV <= '+QuotedStr(TRIM(edt_InvEnde.Text)+'%')
umzusetzten.
Allerdings werden die >= <= nicht berücksichtigt wenn z.B. nach
>= 'AA' und <= 'AA' zur Abfrage aller AA eingegeben wird, die Abfrage bleibt leer.
wenn die Abfrage
>= 'AA' und <= 'AD' erfolgt die Ausgabe aller AA, AB, AC allerdings ohne AD.

Was mach ich hier falsch ? warum funktioniert >= und <= nicht, wie kann man so etwas realisieren ?

vagtler 19. Aug 2015 07:59

AW: SQL Where mit Stringbereich
 
ADxxxx ist größer als AD, demnach solltest Du nach < AE suchen.

Jumpy 19. Aug 2015 08:09

AW: SQL Where mit Stringbereich
 
AAD123 ist größer als AAD, daher kommt nix bei Wert<=AAD.
Du musst also die nur die ersten 3 Zeichen von Wert angucken:

Substr(Wert,1,3)<=AAD usw. wobei Substr ist Oracle, keine Ahnung wie das bei deinem DBMS heißt.

rapante 19. Aug 2015 08:12

AW: SQL Where mit Stringbereich
 
Versuche es mal so:

Code:
WHERE
  (SUBSTR(A.ART_INV from 1 for 2) >= 'AA') AND
  (SUBSTR(A.ART_INV from 1 for 2) <= 'AD')

nahpets 19. Aug 2015 11:25

AW: SQL Where mit Stringbereich
 
Hallo,

das '%' in Deiner Bedingung dürfte zu Irritationen führen, es dient als Platzhalter für beliebige Zeichenfolgen beim Like, aber nicht bei Vergleichen mit <= oder >=.

eventuell könnte aus auch so gehen:
Code:
'WHERE A.ART_INV >= ' + QuotedStr(TRIM(edt_InvStart.Text)
+ 'AND A.ART_INV <= ' + QuotedStr(TRIM(edt_InvEnde.Text) + 'z')

p80286 19. Aug 2015 11:41

AW: SQL Where mit Stringbereich
 
Zitat:

Zitat von nahpets (Beitrag 1312717)
eventuell könnte aus auch so gehen:
Code:
'WHERE A.ART_INV >= ' + QuotedStr(TRIM(edt_InvStart.Text)
+ 'AND A.ART_INV <= ' + QuotedStr(TRIM(edt_InvEnde.Text) + 'z')

Dann würden Alle Nummern mit AAz00... ebenfalss hinten herunter fallen!
wie wäre es mit
Code:
maxwert:=TRIM(edt_InvEnde.Text);
maxwert[length(maxwert)]:=succ(maxwert[length(maxwert)]);
'WHERE A.ART_INV >= ' + QuotedStr(TRIM(edt_InvStart.Text)
+ 'AND A.ART_INV <= ' + QuotedStr(maxwert)
(sofern succ überhaupt mit char umgehen kann).

Gruß
K-H

nahpets 19. Aug 2015 11:48

AW: SQL Where mit Stringbereich
 
Anstelle von 'z' müsste ein Wert stehen, der größer als alles Andere, was da so vorkommen kann, ist.

Oder anders formuliert:
Code:
QuotedStr(TRIM(edt_InvEnde.Text) + 'z')
müsste, Aufgrund des Vergleiches mit '<=' den größtmöglichen Wert von
Code:
A.ART_INV
für den konkreten Vergleich repräsentieren.

Sir Rufo 19. Aug 2015 12:16

AW: SQL Where mit Stringbereich
 
Ich würde mir mit zwei Abfragen per LIKE jeweils den ersten und den letzen Eintrag heraussuchen und damit dann die echte Abfrage starten.

UPDATE

Ok, es geht auch komplett in einer Abfrage ;)
SQL-Code:
SELECT * FROM A
WHERE
  ART_INV LIKE 'AAB%'
OR
  ART_INV LIKE 'BAD%'
OR
  ( ART_INV > 'AAB' AND ART_INV < 'BAD' )

waldforest 19. Aug 2015 13:39

AW: SQL Where mit Stringbereich
 
Hallo,
klasse Umsetzung von Sir Rufo funktioniert, vielen Dank !!

Ergänzende Info:
vielleicht hatte ich nicht erwähnt, dass die Art_Inv insgesamt 8 Zeichen groß ist
Wenn nun der bis - String mehr Zeichen als der Von-String hat. ist es noch nicht sauber.
z.B.
Delphi-Quellcode:
SELECT * FROM A
WHERE
  ( ART_INV LIKE 'AA%' and AND ART_INV < 'AAD2' )
OR
   ART_INV LIKE 'AAD2%'
OR
   ( ART_INV > 'AAB' AND ART_INV < 'AAD2' )
In diesem Fall würden auch alle AAV mit ausgegeben. Liegt an der ersten Bedingung
ART_INV LIKE 'AA%', somit ist die Bedingung noch zu erweitern

Jumpy 19. Aug 2015 14:44

AW: SQL Where mit Stringbereich
 
Was ist den gegen die Substr-Variante einzuwenden. Sollte das folgende nicht das selbe Ergebnis liefern?

Delphi-Quellcode:
SELECT * FROM A
WHERE Substr(ART_INV,1,2)>='AA' AND Substr(ART_INV,1,4)<='AAD2'


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:47 Uhr.
Seite 1 von 2  1 2      

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