[SQL,ORACLE] Stringumwandlung zw. Größenvergleich

Hallo,

ich habe dieses Forum schon bzgl. meiner Problemstellung durchsucht aber nichts zufriedenstellendes gefunden. Ich muss auf eine Datenbank zugreifen, in der nur Strings abgelegt sind. In einem speziellen Fall muss ich eine Zeile einer Tabelle auslesen, wobei ich die Bezugsgröße BG (Primärschlüssel) nicht kenne. Dieser ergibt sich erst durch einen Größenvergleich. Hier in diesem Fall muss ich schauen zwischen welchen Werten meine Größe D (=250) liegt. Erst dann ergibt sich meine gesuchte Bezugsgröße.

Also z.B. Tabelle ABCD_T1:

BG D2min D2max weitere Werte
1 100 200 …
2 205 300 …
3 305 400 …

Mein Select-Statement sieht bisher folgendermaßen aus:

SELECT BG FROM View1 WHERE
KS_Name = ‚ABCD‘ AND
Tab_Name = ‚ABCD_T1‘ AND
(Col_Name = ‚D2min‘ AND Val ‚250‘)

Ich kann natürlich nicht zwei Strings numerisch vergleichen. Aber es gibt doch die Funktion to_number. Ich weiß einfach nicht weiter. Wie muss mein Select-Statement aussehen? Ich bin für jede Hilfe dankbar.

Gruß,
Stevie

Hallo,

[…]

Aber es gibt doch die Funktion to_number. Ich weiß einfach
nicht weiter. Wie muss mein Select-Statement aussehen? Ich bin
für jede Hilfe dankbar.

[…]

Gruß,
Stevie

Sorry wenn ich lachen muss, ich weiß ja nicht was Sinn und Zweck dieser Anwendung ist, aber wer das gebsatelt hat war echt „kreativ“.

So und jetzt mal Ernsthaft:

Ich habe noch nicht ganz verstanden was du haben möchtest, to_number wird nicht funktionieren, weil du einen Text nicht in eine Zahl verwandeln kannst.
Du kannst höchstens die Länge des Strings auslesen. Und zwar entweder die Anzahl an Zeichen mit lengthc(zeichenkette) oder die Anzahl an Bytes mit lengthb(Zeichenkette)
das Select wäre dann z.B(ohne Kontrolle).:

SELECT BG FROM View1
WHERE KS_Name = ‚ABCD‘
AND Tab_Name = ‚ABCD_T1‘
AND (Col_Name = ‚D2min‘ AND lengthc ‚250‘)

Übrigens würde ich so eine größer/kleiner- Auswahl immer in Decode oder Case packen…

Gruß Benjamin

Hallo Benjamin,

Sorry wenn ich lachen muss, ich weiß ja nicht was Sinn und
Zweck dieser Anwendung ist, aber wer das gebsatelt hat war
echt „kreativ“.

zum Sinn und Zweck kann ich nichts sagen, weil ich diese Datenbank so als Konstruktionsdatenbank vorgefunden habe und damit arbeiten muss. Sie macht aber durchaus in konstruktiver Hinsicht Sinn. Mehr kann ich dazu nicht sagen, weil ich absoluter SQL-Laie bin.

Ich habe noch nicht ganz verstanden was du haben möchtest,
to_number wird nicht funktionieren, weil du einen Text nicht
in eine Zahl verwandeln kannst.

Aber wofür ist denn to_number sonst da? Ich habe folgende Definition von to_number vorgefunden:
„Mit TO_NUMBER wird ein CHAR-Feld in ein numerisches Feld konvertiert. Dabei muss von einem bereits numerischen Wertinhalt ausgegangen werden.“

Aber vielleicht erläutere ich noch mal was ich genau brauche damit es nicht zu Missverständnissen kommt:

Aus der folgenden Tabelle ABCD_T1 möchte ich eine Zeile auslesen.
BG D2min D2max weitere Werte
1 100 200 …
2 205 300 …
3 305 400 …

Der notwendige Primärschlüssel ist BG (1,2 oder3). Den kenne ich aber nicht. Ich habe aber eine Größe D (=250). Diese muss ich zunächst mit den Werten D2min und D2max vergleichen. Hier würde also D (=250) zwischen D2min=205 und D2max=300 liegen. Demzufolge ist meine ermittelte Bezugsgröße BG = 2. Genau das muss ich in SQL umsetzen. Dabei wird in der hiesigen Datenbank nicht mit Basistabellen gearbeitet sondern mit einer View.

Mein SQL-Statement sieht bisher folgendermaßen aus:

SELECT BG FROM View1 WHERE
KS_Name = ‚ABCD‘ AND
Tab_Name = ‚ABCD_T1‘ AND
(Col_Name = ‚D2min‘ AND Val = 250)))

Wenn ich einen der beiden Vergleiche (mit D2min oder D2max) herausnehme funktioniert die Select-Anweisung. Ich denke, dass es nicht richtig ist, dass zwei verschiedene Spalten auftauchen. Aber die Verknüpfung der Bedingungen liefert doch eigentlich ein eindeutiges Ergebnis. Was mache ich falsch? Danke für jede Hilfe!

Gruß,
Stevie

Aber wofür ist denn to_number sonst da? Ich habe folgende
Definition von to_number vorgefunden:
„Mit TO_NUMBER wird ein CHAR-Feld in ein numerisches Feld
konvertiert. Dabei muss von einem bereits numerischen
Wertinhalt ausgegangen werden.“

Ok, ich glaub jetzt hab ich dich richtig verstanden:
deine Definition ist richtig.

Ich hoffe mal ich habe jetzt dein wesentliches Problem herausgefiltert.
wenn du mit Oracle arbeitest versuchs mal damit:

SELECT * FROM view v WHERE 250 BETWEEN v.d2min AND v.d2max
SELECT * FROM view v WHERE v.d2min 250

Ich weiss nicht welche Oracle Version du hast, aber normalerweise kannst du dir hier das to_number und die Hochkommata schenken, er würde erst krachen wenn in deiner Spalte ein ‚abcd‘ statt ‚250‘ steht

Hallo Benjamin,

wenn du mit Oracle arbeitest versuchs mal damit:

SELECT * FROM view v WHERE 250 BETWEEN v.d2min AND v.d2max
SELECT * FROM view v WHERE v.d2min 250

okay, ich werde das mal austesten. Ich verstehe das richtig, dass das zwei Alternativen sind, richtig? Die sollten doch äquivalent sein, oder?

Jetzt habe ich noch folgendes Problem. Hab gerade in einer Tabelle gesehen, dass ein paar Schlauberger als Werteintrag für D2min bzw. auch für D2max ein ‚-‘ eingetragen haben.

BG D2min D2max
1 - 300
2 305 400
3 405 -

In dem einen Fall (D2min) müsste richtigerweise eine 0 stehen. Im Fall D2max müsste eher unendlich bzw. eine sehr große Zahl stehen. Wie kann ich das denn abfangen, dass ein Bindestrich eben als 0 bzw. als z.B. 1000000 betrachtet wird?
Vielen Dank schon einmal für die tollen Anregungen. Das hilft mir bestimmt weiter. Ich selber hatte schon eine Lösung mit INTERSECT. Erscheint mir aber eher „Quick and Dirty“. Aber es funktioniert:

SELECT BG FROM View1 WHERE KS_Name = ‚ABCD‘ AND
Tab_Name = ‚ABCD_T1‘ AND (Col_Name = ‚D2min‘ AND Val = 250)

Gruß,
Stevie

REPLACE zur Textersetzung…
Hi Stevie

okay, ich werde das mal austesten. Ich verstehe das richtig,
dass das zwei Alternativen sind, richtig? Die sollten doch
äquivalent sein, oder?

Ja, die beiden Lösungen stellen das Selbe dar, BETWEEN finde ich eben einfach schöner(!Achtung, bei BETWEEN muss immer zuerst die kleinere Größe angegeben werden)

Jetzt habe ich noch folgendes Problem. Hab gerade in einer
Tabelle gesehen, dass ein paar Schlauberger als Werteintrag
für D2min bzw. auch für D2max ein ‚-‘ eingetragen haben.

Da du für d2min und max Texte hast, könntest du Replace verwenden,
bei „min“

SELECT REPLACE(d2min,’-’,‚0‘)FROM tabelle

bei „max“

SELECT REPLACE(d2min,’-’,‚9999999‘)FROM tabelle

!!!Achtung, das funktioniert nur wenn wirklich nur das Minus und nichts anderes vorkommt, wenn du z.B. ‚-1‘ irgendwo drin stehen hättest würde aus dem Minus eine 0 werden… zum testen einfach

SELECT REPLACE(’-1’,’-’,‚0‘)FROM dual

Gruß Benjamin