使用CAST插入...选择

时间:2015-03-01 16:45:18

标签: mysql sql

我试图使用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

2 个答案:

答案 0 :(得分:2)

使用CASEIF明确设置空字符串的值:

  • 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 SELECTUNION 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;

SQL Fiddle Demo here