2017-06-27 6 views
-1

Ich habe Nummern als Varchar in der Tabelle gespeichert (ich weiß, es ist eine schlechte Praxis, aber die Daten kommen nicht von mir), und ich möchte sie mit 25.4, Runde zu Integer (so 9.448 sollte 10 sein), und speichern Sie als tinyint (2) unsigniert. Wenn der Wert von varchar 240 ist, bekomme ich nach der Division 9 was falsch ist. Wenn ich CAST 240 bis DECIMAL (ich muss dezimal verwenden, weil manchmal sind sie wie 240,5) dann gibt es korrekte Ergebnis nach der Division (aber ich muss ROUND es 4x mit 3, 2, 1, 0 Dezimalstellen), aber ich kann die Tabelle aktualisieren, die mit diesem Befehl:MySql Nummer als Text Division

UPDATE `table` SET dz = ROUND(ROUND(ROUND(ROUND(CAST(REPLACE(d, ',', '.') AS DECIMAL (6,1))/25.4, 3), 2), 1), 0); 

, weil ich die folgenden Fehlermeldung bekommen, was ich verrückt:

Falscher Dezimalwert: ‚0‘ für die Spalte ‚‘ in Zeile -1

weil in der wählen Sie es funktioniert:

SELECT DISTINCT d, ROUND(ROUND(ROUND(ROUND(CAST(REPLACE(d, ',', '.') AS DECIMAL (6,1))/25.4, 3), 2), 1), 0) AS dz FROM `table`; 

was ist hier los ...? Danke im Voraus!

Antwort

0

Hat Daten sein .Ich kann (glaube ich) Ihre Fehler reproduzieren, wie unten (letzte Einfügewert sehen)

drop table if exists t; 
create table t (d varchar(10), dz tinyint(2)); 

insert into t values 
('240',null), 
('240,5',null), 
('9,448',null), 
('240 ',null), 
('240,',null), 
(' ,1',null), 
('1,0',null), 
('0 ,1',null); 
MariaDB [sandbox]> UPDATE t SET dz = 
    -> ROUND(
    -> ROUND(
    -> ROUND(
    -> ROUND(
    -> CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4 
    -> , 3) 
    -> , 2) 
    -> , 1) 
    -> , 0); 
ERROR 1292 (22007): Truncated incorrect DECIMAL value: '0 .1' 
MariaDB [sandbox]> 

Wie Sie die Auswahl sagen kein Problem

MariaDB [sandbox]> select *, 
    -> REPLACE(d, ',', '.') 
    -> ,CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4 
    -> from t; 
+-------+------+----------------------+--------------------------------------------------------+ 
| d  | dz | REPLACE(d, ',', '.') | CAST(REPLACE(trim(d), ',', '.') AS DECIMAL (6,1))/25.4 | 
+-------+------+----------------------+--------------------------------------------------------+ 
| 240 | NULL | 240     |            9.44882 | 
| 240,5 | NULL | 240.5    |            9.46850 | 
| 9,448 | NULL | 9.448    |            0.37008 | 
| 240 | NULL | 240     |            9.44882 | 
| 240, | NULL | 240.     |            9.44882 | 
| ,1 | NULL | .1     |            0.00394 | 
| 1,0 | NULL | 1.0     |            0.03937 | 
| 0 ,1 | NULL | 0 .1     |            0.00000 | 
+-------+------+----------------------+--------------------------------------------------------+ 
8 rows in set, 1 warning (0.00 sec) 

Ich habe hat keine Ahnung warum es einen Unterschied zwischen Update und Select geben sollte. Als Abhilfe könnte man so etwas wie dieses aufzuräumen Sie können als jemals

replace(
    REPLACE(trim(d), ',','.') 
    ,' .','.') 

straffen auf Ihrem ersetzen Gigo müssen d, bevor Sie Updates versuchen.