M@tthias
18-01-13, 10:12
Liebe SQL-Experten,
leider verzweifle ich gerade an einer scheinbar banalen Aufgabe. Ich weiß nicht, ob meine SQL-Kenntnisse in den letzten Jahren zu sehr eingerostet sind, oder ob ich einfach nur ein Brett vorm Kopf habe.
Es geht um folgendes: ich habe eine SQL-Tabelle mit u.a. den Spalten Wert_Min und Wert_Max. Beide sind vom Typ CHAR(10). Die Tabelle wird verwendet, um für globale Einstellungen zulässige Werte vorzudefinieren. Zum einen konkrete Werte (die werden dann jeweils nur in Wert_Min geschrieben), aber auch tatsächlich Wertebereiche (i.W. numerische Intervalle). Dafür wollte ich gerne keine zusätzlichen Spalten anlegen, sondern die Char-Spalten universell einsetzen.
Nun mein Problem: wenn ich einen Wertebereich von 10 bis 30 zulassen will und die Vergleiche mit Strings vornehme (... WHERE Wert_Min <= :wert AND Wert_Max >= :wert), ist z.B. '2000' ein gültiger Wert. Daher möchte ich hier wirklich numerisch vergleichen. Ich scheitere daran, die Datentypen kompatibel zu bekommen. Habe es sogar mit einer WITH AS Tabelle versucht:
WITH numerischeBereiche AS (
SELECT cast(Wert_Min AS int) AS min, cast(Wert_Max AS int) AS max
FROM SqlTest.WP_Wertebereich
WHERE Parameter_Id = 4 AND Wert_Max IS NOT NULL
)
SELECT *
FROM numerischeBereiche
WHERE min <= 15
Liefert den Fehler
[SQL0802] Fehler bei Datenumsetzung oder beim Zuordnen von Daten. Ursache . . . . : Fehler der Art 6 ist aufgetreten: Fehlerarten und ihre Bedeutung: [...] 6 -- Ungültige numerische Daten
Ohne die WHERE-Bedingung am Ende klappt es. Das lustige ist, dass die Daten in der mittels WITH AS erzeugten Tabelle wirklich numerisch zu sein scheinen. Ersetze ich bei den CASTs int durch z.B. real, werden die Zahlen mit Dezimalpunkt angezeigt. Ich komme hier einfach nicht weiter und hoffe sehr auf eure Ratschläge.
Beste Grüße
Matthias
leider verzweifle ich gerade an einer scheinbar banalen Aufgabe. Ich weiß nicht, ob meine SQL-Kenntnisse in den letzten Jahren zu sehr eingerostet sind, oder ob ich einfach nur ein Brett vorm Kopf habe.
Es geht um folgendes: ich habe eine SQL-Tabelle mit u.a. den Spalten Wert_Min und Wert_Max. Beide sind vom Typ CHAR(10). Die Tabelle wird verwendet, um für globale Einstellungen zulässige Werte vorzudefinieren. Zum einen konkrete Werte (die werden dann jeweils nur in Wert_Min geschrieben), aber auch tatsächlich Wertebereiche (i.W. numerische Intervalle). Dafür wollte ich gerne keine zusätzlichen Spalten anlegen, sondern die Char-Spalten universell einsetzen.
Nun mein Problem: wenn ich einen Wertebereich von 10 bis 30 zulassen will und die Vergleiche mit Strings vornehme (... WHERE Wert_Min <= :wert AND Wert_Max >= :wert), ist z.B. '2000' ein gültiger Wert. Daher möchte ich hier wirklich numerisch vergleichen. Ich scheitere daran, die Datentypen kompatibel zu bekommen. Habe es sogar mit einer WITH AS Tabelle versucht:
WITH numerischeBereiche AS (
SELECT cast(Wert_Min AS int) AS min, cast(Wert_Max AS int) AS max
FROM SqlTest.WP_Wertebereich
WHERE Parameter_Id = 4 AND Wert_Max IS NOT NULL
)
SELECT *
FROM numerischeBereiche
WHERE min <= 15
Liefert den Fehler
[SQL0802] Fehler bei Datenumsetzung oder beim Zuordnen von Daten. Ursache . . . . : Fehler der Art 6 ist aufgetreten: Fehlerarten und ihre Bedeutung: [...] 6 -- Ungültige numerische Daten
Ohne die WHERE-Bedingung am Ende klappt es. Das lustige ist, dass die Daten in der mittels WITH AS erzeugten Tabelle wirklich numerisch zu sein scheinen. Ersetze ich bei den CASTs int durch z.B. real, werden die Zahlen mit Dezimalpunkt angezeigt. Ich komme hier einfach nicht weiter und hoffe sehr auf eure Ratschläge.
Beste Grüße
Matthias