更新查询中的强制转换功能问题

时间:2020-03-03 16:26:10

标签: mysql sql mysql-5.6

这是一个简单的表格和测试数据,我将用来演示我的问题:

create table foo(
  id INTEGER AUTO_INCREMENT PRIMARY KEY,
  orderpos int not null
);

insert into foo (orderpos) values (1);
insert into foo (orderpos) values (2);
insert into foo (orderpos) values (3);
insert into foo (orderpos) values (4);
insert into foo (orderpos) values (5);

我想用如下查询更新某些字段:

update foo
set orderpos = 
        CAST( 
        CASE 
          WHEN id = 2 THEN 4
          WHEN id = 3 THEN 8
         END
         AS INTEGER 
        )  
where id in(2, 3);

但是我得到了错误

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER 
        )  
where id in(2, 3)'

我知道通过删除CAST查询是可以的,但是我想了解为什么不允许此操作?

MySQL是5.6 这是小提琴http://sqlfiddle.com/#!9/420d7f

的链接

2 个答案:

答案 0 :(得分:2)

在这种情况下,您不需要使用CAST()。

但为了记录在外,该错误是因为您在语法不支持的位置使用INTEGER

确定:

CAST(<expr> AS SIGNED)
CAST(<expr> AS SIGNED INTEGER)
CAST(<expr> AS UNSIGNED)
CAST(<expr> AS UNSIGNED INTEGER)

错误:

CAST(<expr> AS INTEGER)

请参阅CAST()CONVERT()的文档,以了解受支持的数据类型语法:https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html

答案 1 :(得分:1)

不需要cast()。只需使用:

set orderpos = (CASE WHEN id = 2 THEN 4
                     WHEN id = 3 THEN 8
                END)

如果您确实需要cast(),请使用signedunsigned