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

PostgreSQL:使用CASE语句比较列间值并修正列值的问题排查

问题分析与解决方案

你的SQL语句出现问题的核心原因是错误地用单引号包裹了列名——在SQL中,单引号'是用来定义字符串常量的,而不是引用列名。你写的'Col A' = 'Col B'其实是在比较两个固定字符串"Col A"和"Col B",这两个字符串永远不相等,所以CASE语句会一直走到else分支;而else里的'Col A' = 'Col A'是一个布尔表达式,结果永远是true,这就导致所有行的"Col A (corrected)"列都返回true。

正确的写法思路

我们需要直接引用列名进行比较,当Col A和Col B的值相等时返回NULL,否则返回Col A的原始值。注意:如果你的列名包含空格(比如Col A),需要根据数据库类型用合适的符号包裹列名:

  • MySQL/MariaDB:用反引号`
  • PostgreSQL/Oracle:用双引号"
  • SQL Server:用方括号[](或双引号)

修正后的SQL示例

针对MySQL/MariaDB:

SELECT *,
       CASE WHEN `Col A` = `Col B` THEN NULL ELSE `Col A` END AS "Col A (corrected)"
FROM my_table;

针对PostgreSQL/Oracle:

SELECT *,
       CASE WHEN "Col A" = "Col B" THEN NULL ELSE "Col A" END AS "Col A (corrected)"
FROM my_table;

针对SQL Server:

SELECT *,
       CASE WHEN [Col A] = [Col B] THEN NULL ELSE [Col A] END AS "Col A (corrected)"
FROM my_table;

这样修改后,CASE语句会正确比较两列的实际值:当值相等时返回NULL,不等时保留Col A的原始值,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Joehat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 08:59:09