求助:如何通过多条件CASE语句生成Desire_Final_Contradiction字段
看起来你在尝试基于DataEntry和Contradiction字段的值计算Final_Contradiction,但你的SQL脚本存在几个语法问题导致无法正常运行。我来帮你修正并实现需求:
修正后的SQL解决方案
1. 正确生成Final_Contradiction的查询语句
首先解决核心的字段计算问题,你的原脚本存在表名格式和CASE表达式语法的问题,修正后如下:
SELECT ID, CASE WHEN ( (B.[DataEntry] IN (1, 2) AND B.[Contradiction] = 1) OR (B.[DataEntry] IN (2, 3) AND B.[Contradiction] = 1) ) THEN 1 ELSE 0 END AS Final_Contradiction FROM [Test Sample_Dataset] B; -- 带空格的表名必须用方括号包裹
2. 简化逻辑(可选优化)
注意到你的条件可以合并:DataEntry IN (1,2)和DataEntry IN (2,3)的并集其实是DataEntry IN (1,2,3),所以如果业务规则允许,完全可以简化成更简洁的写法:
SELECT ID, CASE WHEN B.[DataEntry] IN (1, 2, 3) AND B.[Contradiction] = 1 THEN 1 ELSE 0 END AS Final_Contradiction FROM [Test Sample_Dataset] B;
3. 如果需要创建新表存储结果
如果你的目标是把结果存入新表,推荐两种方式:
方式1:自动创建表并插入数据(SELECT INTO)
SELECT ID, CASE WHEN ( (B.[DataEntry] IN (1, 2) AND B.[Contradiction] = 1) OR (B.[DataEntry] IN (2, 3) AND B.[Contradiction] = 1) ) THEN 1 ELSE 0 END AS Final_Contradiction INTO [Sample_Final_Contradiction] -- 新表名称 FROM [Test Sample_Dataset] B;
方式2:先建表再插入数据(更灵活控制表结构)
-- 先定义表结构(根据实际字段类型调整) CREATE TABLE [Sample_Final_Contradiction] ( ID INT, Final_Contradiction BIT -- 用BIT类型存储0/1更节省空间 ); -- 插入计算后的数据 INSERT INTO [Sample_Final_Contradiction] (ID, Final_Contradiction) SELECT ID, CASE WHEN ( (B.[DataEntry] IN (1, 2) AND B.[Contradiction] = 1) OR (B.[DataEntry] IN (2, 3) AND B.[Contradiction] = 1) ) THEN 1 ELSE 0 END FROM [Test Sample_Dataset] B;
关键问题说明
- 带空格的表名:原表名
Test Sample_Dataset包含空格,必须用方括号[]包裹,否则SQL会将其识别为两个独立对象,引发语法错误。 - CASE表达式语法:原脚本中
'Final_Contradiction' = CASE ...的写法不符合SQL标准,正确的别名写法是CASE ... END AS Final_Contradiction。 - 逻辑冗余:合并重复的条件判断能让脚本更易读和维护,当然如果业务规则有特殊限制(比如DataEntry=2需要额外校验),可以保留原逻辑。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

