[ORACLE SQL] Größenvergleich in einer Tabelle

Hallo zusammen,

ich habe ein Problem mit einem SQL-Statement. Das SQL-Statement sieht folgendermaßen aus:

SELECT BG,Val FROM ViewKSValues WHERE
KS_Name = ‚KSEW10008‘ AND
Tab_Name = ‚KSEW10008_T6‘ AND
Col_Name = ‚MD/DK‘ AND
BG IN (SELECT BG FROM ViewKSValues WHERE
KS_Name = ‚KSEW10008‘ AND
Tab_Name = ‚KSEW10008_T6‘ AND (Col_Name = ‚GMAX‘ AND Val > ‚2100‘))

Das Statement mag etwas seltsam erscheinen, hat aber seine Berechtigung. Es funktioniert auch soweit und ich bekomme „ein richtiges Ergebnis“. Das eigentliche Problem ist, dass der Größenvergleich zwischen Val und dem Wert 2100 (Eigentlich kommt aus einer anderen Quelle ebenfalls ein String. Der Einfachheit halber habe ich hier mal einen Beispielstring angegeben.) nicht korrekt ausgeführt wird. Die Werte, die hinter Val stecken sind Strings, d.h. eigentlich dürfte das obige Statement auch gar nicht richtig funktionieren, da ich ja jetzt zwei Strings vergleiche. Deshalb war meine Idee die Hochkommata wegzulassen --> funktioniert nicht.
Dann wollte ich mit TO_NUMBER(‚2100‘) den String in eine Zahl umwandeln. Soweit ich weiß würde ORACLE eine automatische Datentypkonvertierung für Val vornehmen. Funktioniert ebenfalls nicht. Wie kann ich denn jetzt den String (hier als Beispiel ‚2100‘) in eine Zahl umwandeln, so dass ich dies mit meinem Val vergleichen kann?

Vielen Dank für jede Anregung!
Gruß,
Stevie

Hallo zusammen,

ich habe ein Problem mit einem SQL-Statement. Das
SQL-Statement sieht folgendermaßen aus:

SELECT BG,Val FROM ViewKSValues WHERE
KS_Name = ‚KSEW10008‘ AND
Tab_Name = ‚KSEW10008_T6‘ AND
Col_Name = ‚MD/DK‘ AND
BG IN (SELECT BG FROM ViewKSValues WHERE
KS_Name = ‚KSEW10008‘ AND
Tab_Name = ‚KSEW10008_T6‘ AND (Col_Name = ‚GMAX‘ AND Val >
‚2100‘))

Vielen Dank für jede Anregung!
Gruß,
Stevie

Hi Stevie,

nur mal so ein-zwei Grundsätzliche Dinge, die die Lösung deiner Probleme deutlich vereinfachen würde:
-Bitte immer Oracle Version angeben
-Wenn du Fehlermeldungen erhälst, diese Bitte auch angeben

Etwas Offtopic:
warum klammerst du diesen Teil des Statements?

(Col_Name = ‚GMAX‘ AND Val > ‚2100‘)

Macht aus Logitechnischer Sicht keinen Sinn, da du ja zuvor nur AND verknüpfungen hast und keine ORs

Nun zu deinem Problem:
Da ich ja schon eine wenig mit deinen Problemen zu tun hatte, gehe ich davon aus dass VAL eine Textspalte ist. Wenn du darauf Korrekte „größer“/„kleiner“ - Abfragen machen möchtest, musst du natürlich die Spalte konvertieren: to_number(val), wenn jetzt dein Wert(‚2001‘) auch eine String ist, dann musst du beides konvertieren, damit du ein korrektes Ergebnis erhälst. Bsp.: to_number(val) > to_number(‚2001‘)

!!!Achtung!!! to_number funktioniert natürlich nur wenn alle Inhalte der Spalte auch korrekte Zahlen sind, sonst müsstest du das ganze mit einer Exception abfangen.

!Hinweis!
Ich habe schon erlebt(Oracle 9.?.?), dass man sich bei BETWEEN die Typkonvertierung sparen kann, aber wie hier bereits schon erwähnt, ist es immer besser eine Typkonvertierung explizit zu machen, dann wissen andere programmierer auch was gewünscht ist.

Ich hoffe ich bin jetzt nicht am Thema vorbeigeschliddert, weil mir ein paar Infos fehlten. Aber ansonsten kannst du dich ja einfach nochmal melden.

Gruß Benjamin

nur mal so ein-zwei Grundsätzliche Dinge, die die Lösung
deiner Probleme deutlich vereinfachen würde:
-Bitte immer Oracle Version angeben
-Wenn du Fehlermeldungen erhälst, diese Bitte auch angeben

Hallo Benjamin,

zunächst einmal danke für die Hinweise. Werde ich das nächste mal beherzigen.

Etwas Offtopic:
warum klammerst du diesen Teil des Statements?

(Col_Name = ‚GMAX‘ AND Val > ‚2100‘)

Macht aus Logitechnischer Sicht keinen Sinn, da du ja zuvor
nur AND verknüpfungen hast und keine ORs

Da hast Du natürlich Recht. Habe ich weggelassen.

!!!Achtung!!! to_number funktioniert natürlich nur wenn alle
Inhalte der Spalte auch korrekte Zahlen sind, sonst müsstest
du das ganze mit einer Exception abfangen.

Und hier war der Knackpunkt! Ich habe die Datenbank noch einmal kritisch durchforstet und ich habe einen einzigen Eintrag mit einem * entdeckt. Ich habe dies abgefangen und siehe da: es funktioniert.
Also vielen Dank für diese Hilfe. Das war sehr hilfreich! Danke!

Gruß,
Stevie

Und hier war der Knackpunkt! Ich habe die Datenbank noch
einmal kritisch durchforstet und ich habe einen einzigen
Eintrag mit einem * entdeckt. Ich habe dies abgefangen und
siehe da: es funktioniert.
Also vielen Dank für diese Hilfe. Das war sehr hilfreich!
Danke!

Gruß,
Stevie

  • Vielleicht wäre es nun an der Zeit, mal zu überlegen, die DB dahingehen abzuändern, dass nummerisch Werte auch in entsprechenden Felder abgelegt werden ? Das erspart viel Kopfzerbrechen und vorallem ne menge möglicher Bugs in deiner Applikation.

Gruss

Hallo Ulrich,

  • Vielleicht wäre es nun an der Zeit, mal zu überlegen, die DB
    dahingehen abzuändern, dass nummerisch Werte auch in
    entsprechenden Felder abgelegt werden ? Das erspart viel
    Kopfzerbrechen und vorallem ne menge möglicher Bugs in deiner
    Applikation.

völlig richtig. Da gebe ich Dir zu 100% Recht! Das habe ich schon 100mal angesprochen, da auch generell nur numerische Werte aus der DB ausgelesen werden und ich diese letztendlich auch als numerischen Wert brauche. Aber leider habe ich auf die Datenbankstruktur absolut keinen Einfluss und muss das alles als gegeben hinnehmen. Ist leider so.
Aber Recht hast Du!

Gruß,
Stevie

Hi Stevie,

Aber leider habe ich auf
die Datenbankstruktur absolut keinen Einfluss und muss das
alles als gegeben hinnehmen. Ist leider so.

Vielleicht solltest Du die Verbrecher dieses DB-Designs einmal bitten, dass sie das Ganze an http://asktom.oracle.com schicken mit der Bitte um Review. Die kriegen den Kopf so gewaschen, die brauchen sich ihr Leben lang kein Haarshampoo mehr kaufen, versprochen!

Liebe Grüße
Martin (der bittet im Fall, dass das wirklich gemacht wird unbedingt per Mail informiert zu werden - das will ich nicht versäumen *ggg*)