我试图使用CAST(column AS DECIMAL(7,2))
将一些不良数据转换为正确的数据,这只在SELECTing时有效,但一旦与INSERT语句结合,语句就会失败:
/* setup */
drop table if exists dst;
create table dst (
id int not null auto_increment
, columnA decimal(7,2)
, primary key (id)
);
drop table if exists src;
create table src (
id int not null auto_increment
, columnA varchar(255)
, primary key (id)
);
insert into src (columnA) values ('');
/* test */
/* This works as I would like it to*/
select CAST(columnA AS decimal(7,2)) from src; /* returns 0.00 */
/* This fails */
insert into dst (columnA)
select CAST(columnA AS decimal(7,2)) from src;
/*0 19 21:01:56 insert into dst (columnA)
select cast(columnA as decimal(7,2)) from src Error Code: 1366. Incorrect decimal value: '' for column '' at row -1 0.000 sec*/
编辑:这是一个简化的复制示例 - 我的数据 使用它比变成空字符串要多得多 - 它可能会 也可以是非数字字符串值或外部的数值 小数(7,2)的边界 -
CAST
语句的作用 只有在SELECT
但我失败的时候,我希望它的方式 试图将它们用作INSERT
的一部分。
我做错了什么,还是有另一种方法来实现我想要的东西?
我在WIN 7 x64上使用MYSQL 5.6.11
答案 0 :(得分:2)
使用CASE
或IF
明确设置空字符串的值:
SELECT CASE WHEN columnA = '' THEN 0 ELSE CAST(columnA AS decimal(7,2)) END
FROM src;
SELECT IF(columnA <> '', CAST(columnA AS decimal(7,2)), 0)
FROM src;
或者使用2 SELECT
与UNION ALL
:
SELECT CAST(columnA AS decimal(7,2))
FROM src
WHERE columnA <> ''
UNION ALL
SELECT 0
FROM src
WHERE columnA = '';
答案 1 :(得分:1)
您可以尝试使用REGEXP
过滤掉源数据中的任何不正常现象:
INSERT INTO dst (columnA)
SELECT CAST(CASE
WHEN columnA REGEXP '^[0-9]{0,7}(\.[0-9]{0,2})$' THEN columnA
ELSE 0
END AS decimal(7,2))
FROM src;