在Table_1中,我从电子表格导入了数据。在一个表格列中有混合值:94.7,45.0,36,汽车,公共汽车......等。数据类型为VARCHAR(10)
我想将Table_1中此列的值插入Table_2中的DECIMAL(5,1)字段。我希望非数字值注册为0.0。这很重要。
我尝试了几件事,包括CAST(),它可以在我的MySQL GUI中运行,但会提供一系列警告。这是我尝试过的SQL类型的一个例子。
DELETE FROM table_2;
INSERT INTO table_2 (NAME, decimal_column)
(SELECT NAME
, CAST(varchar_column AS DECIMAL(5,1))
FROM table_1) ;
MySQL警告示例。
警告代码:1366十进制数不正确 值:''对于第-1行的列''
警告代码:1292截断 错误的DECIMAL值:'house'
此外,PHP将没有它。当我尝试使用PHP运行相同的查询时,我收到此致命错误消息:
十进制值不正确:''列 ''在第-1行
感谢您的任何建议
答案 0 :(得分:3)
如果您要清除table_2
,可以使用速度更快的TRUNCATE table_2;
。
这样做的一种方法(虽然我不知道它是否是最好的;对于大型数据集来说可能有点慢)是使用正则表达式:
INSERT INTO table_2 (NAME, decimal_column)
(SELECT NAME
, IF(varchar_column REGEXP '^[[:digit:].]+$', varchar_column, 0.0)
FROM table_1) ;
这假设varchar_column
的十进制值中没有空格。如果可能,那么您可以使用TRIM
,如下所示:
IF(TRIM(varchar_column) REGEXP '^[[:digit:].]+$', TRIM(varchar_column), 0.0)
答案 1 :(得分:1)
我尝试了以下内容,它对我很有用:
INSERT INTO `table_2` (`decimal_column`) SELECT CAST(`varchar_column` AS DECIMAL(5,1)) FROM `table_1`;
我使用的表有一个空白值,一个十进制值(作为VARCHAR)和单词“house”,所有内容都按预期转换。
警告可以忽略。它本质上是MySQL告诉你它试图转换它无法转换的数据。例如,“house”这个词不能转换为十进制值,因此MySQL会警告你(PHP也是如此。)你没有在MySQL GUI中看到错误的原因是因为错误被抑制了,因为查询工作。
如果要隐藏错误,可以随时在PHP调用前添加@符号(即@ mysqli->查询('...'),使用ini_set('display_errors',false)禁用所有错误,或者error_reporting(E_NONE)。