CAST NVARCHAR zu Float - nur bei ISNUMERIC

HeikoD

Benutzer
Beiträge
8
Hallo Forum,

ich stehe vor einem Problem. Ich möchte für einen Bericht Daten aus einer Tabelle darstellen. Das Problem: Das Tabellenfeld ist vom Typ NVARCHAR und in diesem Feld sind auch alphanumerische Einträge vorhanden.

Ich dachte, ich könnte die Daten mittels CAST konvertieren, immer dann wenn ein numerischer Wert vorhanden ist. Dazu habe ich das folgende Konstrukt gebaut.


SELECT NAME,
CASE
WHEN (ISNUMERIC(VARVAL) = 0) THEN
VARVAL
ELSE
CAST(VARVAL AS FLOAT)
END AS VARVAL
FROM IDBVAR

Leider funktioniert das aber nicht.
Gibt es einen Weg die Konvertierung von einem Wert im Datensatz abhängig zu machen?
 
Werbung:
recht sicher nicht, weil der Typ einer Ergebnisspalte muß eindeutig sein. Du könntest evtl. es mit einem CASE-Anweisung hinbekommen: falls es konvertierbar ist, konvertieren, sonst NULL liefern. Falls das für Dich okay ist.

Und in Zukunft solchen Murks gleich nicht machen ...
 
Ich würde mit convert() statt mit cast() arbeiten, finde das exakter weil man in einigen Fällen auch Formate mit angeben kann.

Dein Problem wird vermutlich an dem deutschen Komma liegen, eventuell sind auch noch Punkte als Tausender-Trennzeichen vorhanden. Beide Zeichen sind auch numerisch, bedeuten allerdings gänzlich unterschiedliche Dinge in DE und EN. Ich würde daher folgendes versuchen
Code:
(CASE WHEN isnumeric(VARVAL) THEN convert(FLOAT,replace(replace(VARVAL,'.',''),',','.')) ELSE NULL END)
Wenn du eine Zeile nicht konvertierst, also in meinem Fall als ELSE dann passen natürlich deine Datentypen über die ganze Spalte nicht mehr. In sofern müsstest du entweder bei Erfolg zurück in NVARCHAR() konvertieren oder NULL ausgeben bei Fehlschlag, ich würde mich da jetzt für NULL entscheiden. Sollte die Konvertierung nicht klappen zeige den Original-Wert am besten in einer eigenen Spalte an.

Übrigens gibt es bei MSSQL auch try_convert(). Das würde ich aber nur als Absicherung für die Zukunft einbauen und erstmal die Ursache beseitigen aufgrund der die aktuellen Daten nicht sauber konvertiert werden.
 
recht sicher nicht, weil der Typ einer Ergebnisspalte muß eindeutig sein. Du könntest evtl. es mit einem CASE-Anweisung hinbekommen: falls es konvertierbar ist, konvertieren, sonst NULL liefern. Falls das für Dich okay ist.

Und in Zukunft solchen Murks gleich nicht machen ...
Ichhabe diese Konstruktion nicht erfunden ;-)
 
Hallo Forum,

ich stehe vor einem Problem. Ich möchte für einen Bericht Daten aus einer Tabelle darstellen. Das Problem: Das Tabellenfeld ist vom Typ NVARCHAR und in diesem Feld sind auch alphanumerische Einträge vorhanden.
Ich frag mich warum mußt es denn überhaupt konvertieren?
 
Code:
postgres=# select * from heikod ;
 typ  |   wert    
------+-----------
 text | bla fasel
 zahl | 10
(2 rows)

postgres=# select typ, wert, case when typ = 'zahl' then wert::int * 100 else null end as ergebniss from heikod ;
 typ  |   wert    | ergebniss 
------+-----------+-----------
 text | bla fasel |          
 zahl | 10        |      1000
(2 rows)

postgres=#
 
Warum schränkst Du dann nicht mit einer WHERE Bedingung auf die Datensätze ein, mit denen Du auch wirklich rechnen kannst?
Weil der Bericht dahinter diese Daten so benötigt. Es gibt nur einen "Select" für den gesamten Bericht, und aus der Abfrage stammen eben auch die Textinformationen.
Vielen Dank für die Hilfe - ich komme vermutlich nicht weiter ohne das gesamte Konstrukt umzubauen.

Gruß
Heiko
 
Werbung:
Zurück
Oben