结合CONCAT与STRCMP更新状态字段报错,求正确用法
修正你的SQL语句问题
首先看你给出的代码,有几个明显的语法和逻辑问题,我帮你逐一修正并说明:
问题分析
- CASE语句语法错误:你在第一个
THEN后面加了逗号,这不符合SQL语法规范,CASE WHEN的各个分支之间不需要用逗号分隔。 - STRCMP的判断逻辑错误:
STRCMP()函数返回的是数字值(0表示两个字符串相等,-1或1表示不等),不能用NOT LIKE "0"来判断,应该直接用!= 0或者<>来判断不等的情况。 - 字符串常量的引号使用:SQL中标准写法是用单引号包裹字符串常量,虽然部分数据库支持双引号,但单引号能避免和标识符(比如字段名)的歧义,更推荐使用。
修正后的SQL语句
假设你的需求是:当拼接后的两组字符串相等时,status2设为'same';不等时设为'changed',修正后的代码如下:
UPDATE DMGE1314 SET status2 = CASE WHEN STRCMP(CONCAT(KodDM14, NamaDM14), CONCAT(KodDM13, NamaDM13)) = 0 THEN 'same' ELSE 'changed' END;
如果你更习惯直接用相等判断(和STRCMP的效果在多数场景下一致),也可以写成:
UPDATE DMGE1314 SET status2 = CASE WHEN CONCAT(KodDM14, NamaDM14) = CONCAT(KodDM13, NamaDM13) THEN 'same' ELSE 'changed' END;
额外扩展说明
STRCMP()和直接用=判断的细微区别:STRCMP()会严格遵循数据库的排序规则(collation),比如在大小写敏感的排序规则下,'ABC'和'abc'会被判定为不等;直接用=的行为同样依赖排序规则,大部分场景下两者效果一致,你可以根据自己的数据库配置选择。- 如果需要更细致的状态区分(比如单独判断编码或名称变化),可以扩展
CASE分支:
UPDATE DMGE1314 SET status2 = CASE WHEN KodDM14 = KodDM13 AND NamaDM14 = NamaDM13 THEN 'same' WHEN KodDM14 != KodDM13 THEN 'code_changed' WHEN NamaDM14 != NamaDM13 THEN 'name_changed' ELSE 'changed' END;
内容的提问来源于stack exchange,提问作者Syahirah AR
相关产品推荐
相关产品推荐

