![]() |
Datenbank: MySQL • Version: 5.6 • Zugriff über: MyDac
Alphanumerische Werte eingrenzen (ähnlich Between)
Ich habe zwei Tabellen, in der einen sind Reparaturdaten erfasst und in der anderen die jeweiligen Stammdaten der Produkte.
Nun möchte ich abfragen, ob Geräte eines bestimmten Seriennummern-Bereichs bereits einmal erfasst worden sind. Der Aufbau der Seriennummer ist pro Produkt zwar identisch, kann aber rein numerisch oder aber alphanumerisch ausfallen (z.B. 123 und B12). Bei rein numerischen Seriennummer könnte ich zwar mit "Between" den Bereich einengen, dies funktioniert aber bei alphanumerischen Werten nicht. Also habe ich versucht, mit den üblichen Operatoren zu arbeiten. Allerdings gelingt es mir nicht, die Abfrage so zu gestalten, dass in beiden Fälle korrekte Werte zurück geliefert werden. Mit Hochkommata's ("") werden keine rein numerischen Werte "gefunden" und ohne kann ich nicht nach alphanumerischen Werten abfragen :-( Kann mir jemand einen Tipp geben, was ich falsch mache und wie ich die Abfrage gestalten müsste, damit sie korrekte Werte liefert?
Code:
Select * from REPARATUR INNER JOIN MATERIAL) ON
REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND MATERIAL.MATERIALNR = "10012345" AND (REPARATUR.SERIENNUMMER >= 1 AND REPARATUR.SERIENNUMMER <= 100) |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Anstatt 'BETWEEN' kannst Du auch 'LIKE' verwenden, sofern das Seriennummernformat das zulässt.
Du solltest angeben, wie die Seriennummern aufgebaut sind. |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Hier wäre es aus meiner Sicht erst einmal wichtig zu erfahren, wie denn deine Serien-Nummern-Bereiche organisiert sind. Hat z.B. das erste Zeichen eine bestimmte Bedeutung? Oder anders gefragt: Weisen die Serien-Nummern eine einheitliche Gliederung auf? Z.B.: Bedeutet das erste Zeichen B, daß das Ding aus der Abteilung B stammt?
Worauf ich hinaus will: Wenn eine einheitliche Gleiderung der Serien-Nummern existiert, könnte man diese Gliederung irgendwie berechnen? Zitat:
Zweitens liegen die Seriennummern doch stets als String bzw. VarChar vor, müssen also beim Suchen immer in Hochkommatas eingeschlossen sein. Ob der String nun numerisch interpretierbar wäre oder nicht, kümmert die Datenbank eigentlich erstmal nicht. |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Zitat:
- Rein numerisch und fortlaufend (100,101,102,...) - Beginnend mit einem Buchstaben und danach wiederum mit einem fortlaufenden Zahlenwert (B100, B101, B202,...) (Der Buchstaben dient als Versionsindex) Konkret möchte ich z.B. sämtliche Geräte mit der Seriennummer 100 - 200, bzw. B100 - B200 aufgelistet haben. Funktioniert 'Like' nicht nur bei übereinstimmenden Suchbegriffen? /Edit Zitat:
Mit der Abfrage
Code:
wird der Datensatz nicht gefunden (leere Datenmenge), ohne Hochkommata hingegen schon.
Select * from REPARATUR INNER JOIN (MATERIAL) ON
REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND MATERIAL.MATERIALNR = "10012345" AND (REPARATUR.SERIENNUMMER >= '1' AND REPARATUR.SERIENNUMMER <= '200') /Edit2: Schreibfehler korrigiert (Wert von 100 auf 200 korrigiert) |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Also '100-200' ginge so (ist aber keine schöne Lösung)
Code:
Ich verstehe aber nicht, wieso das nicht mit 'BETWEEN' funktioniert sollte, fällt mir gerade ein. Das ist ja eine totale Ordnung, da die Vergleichsoperastionen vollständig definiert sind. Also, in MSSQL geht das jedenfalls.
where Seriennummer like '1??' or Seriennummer='200'
Code:
where Seriennummer between '100' and '200'
|
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Zitat:
Zitat:
Zumindest
Code:
liefert mir eine Datenmenge zurück,
where Seriennummer between 100 and 200
Code:
hingegen nicht.
where Seriennummer between '100' and '200'
|
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Zitat:
Weiter unten in den Posts steht da nun 200 und 150 wird trotzdem nicht angezeigt? Du hast das sicher irgendwo einen Bock drin. Lass die Daten sortiert ausgeben, frage auf =150 ab. Irgendwas stimmt da nicht. Wie ist der Typ dieser Spalte definiert? |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Zitat:
Aktuell habe ich es so gelöst, dass zuerst ein 'between' versucht wird. Führt dies zu keinem Ergebnis, mache ich eine neue Abfrage mit logischen Operatoren. So komme ich zwar zu meinen Daten, aber dies müsste doch sicher einfacher gehen.
Delphi-Quellcode:
// Da Between nur numerische Werte enthalten darf und die logischen Operatoren
// bei rein numerischen Werten wiederum keine Datenmenge zurückliefern, wird // aktuell dieser Workarround benutzt. // Da Alphanumerische Werte bei einer between Abfrage zu einer Exception führen, // wird dies in ein "try-except" verpackt try quSuchen.SQL.Text := 'Select * from REPARATUR INNER JOIN ' + '(MATERIAL) ON ' + 'REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND ' + 'MATERIAL.MATERIALNR = :MaterialNr AND ' + '(REPARATUR.SERIENNUMMER between :SerNr_Start AND :SerNr_Ende)'; quSuchen.ParamByName('MATERIALNR').AsString := edMaterialNr.Text; quSuchen.ParamByName('SerNr_Start').AsInteger := StrToInt(edSerienNr_Start.Text); quSuchen.ParamByName('SerNr_Ende').AsInteger := StrToInt(edSerienNr_Ende.Text); quSuchen.Active := True; except end; if quSuchen.RecordCount = 0 then begin try quSuchen.SQL.Text := 'Select * from REPARATUR INNER JOIN ' + '(MATERIAL) ON ' + 'REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID AND ' + 'MATERIAL.MATERIALNR = :MaterialNr AND ' + '(REPARATUR.SERIENNUMMER >= :SerNr_Start AND ' + ' REPARATUR.SERIENNUMMER <= :SerNr_Ende) AND ' + 'REPARATUR.DATUM BETWEEN :Datum_Start AND :Datum_Ende'; quSuchen.ParamByName('MATERIALNR').AsString := edMaterialNr.Text; quSuchen.ParamByName('SerNr_Start').AsString := edSerienNr_Start.Text + '%'; quSuchen.ParamByName('SerNr_Ende').AsString := edSerienNr_Ende.Text + '%'; quSuchen.ParamByName('DATUM_START').AsDate := edDatum_Start.Date; quSuchen.ParamByName('DATUM_ENDE').AsDate := edDatum_Ende.Date; quSuchen.Active := True; except end; end; |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Wie sieht es denn mit
![]() Andererseits könntest du überlegen, ob du die Zugehörigkeit zu einem Seriennummernbereich nicht schon in der Datenbank modellieren willst. |
AW: Alphanumerische Werte eingrenzen (ähnlich Between)
Zitat:
Deine Lösung mit '>= and <=' ist doch super, nur haben die '%' Zeichen dort nichts verloren. Das sind Wildcards für die LIKE Suche. Das ich darauf nicht früher gekommen bin... (also mit '>= AND <=')...:oops: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:25 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