![]() |
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:
umzusetzten.
WHERE
A.ART_INV >= '+QuotedStr(TRIM(edt_InvStart.Text)+'%') AND A.ART_INV <= '+QuotedStr(TRIM(edt_InvEnde.Text)+'%') 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 ? |
AW: SQL Where mit Stringbereich
ADxxxx ist größer als AD, demnach solltest Du nach < AE suchen.
|
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. |
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') |
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') |
AW: SQL Where mit Stringbereich
Zitat:
wie wäre es mit
Code:
(sofern succ überhaupt mit char umgehen kann).
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) Gruß K-H |
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:
müsste, Aufgrund des Vergleiches mit '<=' den größtmöglichen Wert von
QuotedStr(TRIM(edt_InvEnde.Text) + 'z')
Code:
für den konkreten Vergleich repräsentieren.
A.ART_INV
|
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' ) |
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:
In diesem Fall würden auch alle AAV mit ausgegeben. Liegt an der ersten Bedingung
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' ) ART_INV LIKE 'AA%', somit ist die Bedingung noch zu erweitern |
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 03:24 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