MySQL - 在重复键上 - CASE WHEN THEN ELSE 不起作用

Posted

技术标签:

【中文标题】MySQL - 在重复键上 - CASE WHEN THEN ELSE 不起作用【英文标题】:MySQL - on duplicate key - CASE WHEN THEN ELSE doesnt work 【发布时间】:2016-01-27 17:19:19 【问题描述】:

我想在数据库中插入一个条目(uid、A、B)。如果条目已经存在,我将使用条件更新“A”和“B”列: (1 = 旧条目;[2] = 新条目)

A = (B[1] == B[2]) ? A[1] : A[2];
B = B[2] + 1;

我的查询:

INSERT INTO TableName (uid,A,B) 
VALUES (uid,A[2],B[2]) 
ON DUPLICATE KEY 
UPDATE  A= (SELECT CASE B WHEN B[2] THEN A ELSE A[2] END), 
        B= B[2]+1;

Ex1:

Old entry : uid = 1; A = 2; B = 4;
New entry : uid = 1; A = 3; B = 4;
-> Should be: A = 2; B = 5;
But my result: A = 3; B = 5; -> FAIL

Ex2:

Old entry : uid = 1; A = 2; B = 4;
New entry : uid = 1; A = 3; B = 6;
-> A = 3; B = 7; (my code works well in this ex) -> OK

非常感谢。

答案 1:删除 SELECT 键使其工作

INSERT INTO TableName (uid,A,B) 
VALUES (uid,A[2],B[2]) 
ON DUPLICATE KEY 
UPDATE  A= (CASE B WHEN B[2] THEN A ELSE A[2] END), 
        B= B[2]+1;

p-jairaj的答案

INSERT INTO TableName (uid,A,B) 
VALUES (uid,A[2],B[2]) 
ON DUPLICATE KEY 
UPDATE  A= (IF(B=B[2],A,A[2])), 
        B= B[2]+1;

【问题讨论】:

什么不起作用?你有语法错误吗? 【参考方案1】:

试试这个:

INSERT INTO TableName (uid,A,B) 
VALUES (uid,A[2],B[2]) 
ON DUPLICATE KEY 
UPDATE  A= (IF(B=B[2],A,A[2])), 
        B= B[2]+1;

【讨论】:

以上是关于MySQL - 在重复键上 - CASE WHEN THEN ELSE 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mysql 查询某个字段并拼接case when出来的字段

Mysql Case when

mysql case when 碰上中文字符串

MySQL case when 使用

MySQL Case When 用法

如何检查Case When Statement中的重复值