You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结合CONCAT与STRCMP更新状态字段报错,求正确用法

修正你的SQL语句问题

首先看你给出的代码,有几个明显的语法和逻辑问题,我帮你逐一修正并说明:

问题分析

  1. CASE语句语法错误:你在第一个THEN后面加了逗号,这不符合SQL语法规范,CASE WHEN的各个分支之间不需要用逗号分隔。
  2. STRCMP的判断逻辑错误:STRCMP()函数返回的是数字值(0表示两个字符串相等,-1或1表示不等),不能用NOT LIKE "0"来判断,应该直接用!= 0或者<>来判断不等的情况。
  3. 字符串常量的引号使用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:33:53