AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Alphanumerische Werte eingrenzen (ähnlich Between)
Thema durchsuchen
Ansicht
Themen-Optionen

Alphanumerische Werte eingrenzen (ähnlich Between)

Ein Thema von blawen · begonnen am 13. Sep 2015 · letzter Beitrag vom 14. Sep 2015
Antwort Antwort
Seite 1 von 2  1 2      
Dejan Vu
(Gast)

n/a Beiträge
 
#1

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 21:05
Anstatt 'BETWEEN' kannst Du auch 'LIKE' verwenden, sofern das Seriennummernformat das zulässt.

Du solltest angeben, wie die Seriennummern aufgebaut sind.
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
710 Beiträge
 
Delphi 12 Athens
 
#2

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 21:16
Anstatt 'BETWEEN' kannst Du auch 'LIKE' verwenden, sofern das Seriennummernformat das zulässt.

Du solltest angeben, wie die Seriennummern aufgebaut sind.
Grundsätzlich geht es um zwei Arten:

- 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
Ob der String nun numerisch interpretierbar wäre oder nicht, kümmert die Datenbank eigentlich erstmal nicht.
Angenommen, es existiert ein Gerät mit der Seriennummer '150' in der Datenbank.
Mit der Abfrage
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 <= '200')
wird der Datensatz nicht gefunden (leere Datenmenge), ohne Hochkommata hingegen schon.

/Edit2:
Schreibfehler korrigiert (Wert von 100 auf 200 korrigiert)
Roland

Geändert von blawen (13. Sep 2015 um 22:53 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#3

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 21:41
Also '100-200' ginge so (ist aber keine schöne Lösung)
Code:
where Seriennummer like '1??' or Seriennummer='200'
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.
Code:
where Seriennummer between '100' and '200'
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
710 Beiträge
 
Delphi 12 Athens
 
#4

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:05
Also '100-200' ginge so (ist aber keine schöne Lösung)
Bei so engen Bereichen würde es gehen, aber bei grösseren Bereichen unpraktikabel.
Zitat:
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.
Bei MySQL funktioniert es (anscheinend) nur mit reinen Zahlenwerten.
Zumindest
Code:
where Seriennummer between 100 and 200
liefert mir eine Datenmenge zurück,
Code:
where Seriennummer between '100' and '200'
hingegen nicht.
Roland

Geändert von blawen (13. Sep 2015 um 22:09 Uhr)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 06:26
Bei so engen Bereichen würde es gehen, aber bei grösseren Bereichen unpraktikabel.
Na nö... Eher bei 'krummen' Bereichen wie '142-379'

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 <=')...
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 08:22
Statt eine Exception abzufangen könntest du doch mit trystrtoint überprüfen, ob dein SerNr_Start rein numerisch oder alphanumerisch ist,und entsprechend mit der ersten oder mit der zweiten Abfrageversion weitermachen.

Geändert von idefix2 (14. Sep 2015 um 08:26 Uhr)
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.493 Beiträge
 
Delphi 12 Athens
 
#7

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 08:47
Selbst wenn der Vergleich von Strings unterstützt wird, ist das Ergebnis bei variabler Stellenanzahl für die Abfrage nicht unbedingt hilfreich:

"B1" < "B100" < "B11" < "B2"

Eine allgemein gültige Lösung ist nur durch Trennung des Präfix von der Zählnummer möglich.

Man könnte schon in der Tabelle zwei zusätzliche Spalten dafür anlegen, die Spalte für die vollständige Nummer würde ich aber trotzdem vorsehen:
- "D1" || 20 -> "D120" und "D" || 120 wird ebenfalls "D120", ein eindeutiger Index über die vollständige Artikelnummer verhindert das.
- Eventuell gibt es eine Bildungsvorschrift mit fester Stellenanzahl für den numerischen Teil "D" || 20 -> "D020"

Alternativ berechnet man den numerischen Teil der Nummer zur Laufzeit in einer Funktion oder View.
Nachteil:
- Bildungsvorschriften können sich im Laufe der Zeit ändern, oder es existieren sogar unterschiedliche je Präfix.
- So kann der Index für die Nummer nicht genutzt werden.

Deshalb halte ich die erste Variante für günstiger.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 14. Sep 2015, 12:18
mal ganz dumm gefragt, warum packst Du eigentlich alle Bedingungen in das JOIN?
U.U bist Du so erfolgreicher:
Code:
Select * 
from REPARATUR JOIN MATERIAL ON (REPARATUR.MATERIAL_ID = MATERIAL.MATERIAL_ID)
Where ganzvielebedingungen......
Einige Datenbanken(/treiber) verschlucken sich an großen JOINs.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 22:42
es existiert ein Gerät mit der Seriennummer '150' in der Datenbank.
Mit der Abfrage
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')
wird der Datensatz nicht gefunden (leere Datenmenge), ohne Hochkommata hingegen schon.
Wieso sollte bei <= '100', 150 angezeigt werden?
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?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von blawen
blawen

Registriert seit: 30. Nov 2003
Ort: Luterbach (CH)
710 Beiträge
 
Delphi 12 Athens
 
#10

AW: Alphanumerische Werte eingrenzen (ähnlich Between)

  Alt 13. Sep 2015, 23:06
Wieso sollte bei <= '100', 150 angezeigt werden?
Sorry, war ein dummer Tippfehler im Posting (200 wäre der korrekte Wert, habe ich im Posting korrigiert).

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;
Roland

Geändert von blawen (13. Sep 2015 um 23:15 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 13:00 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-2025 by Thomas Breitkreuz