SQL含IN的条件WHERE子句语法错误及正确写法咨询
正确的SQL写法解决你的筛选需求
嘿,我来帮你搞定这个SQL查询的问题!首先得说清楚:你之前在WHERE子句里用IF语句报错,是因为SQL的WHERE子句不支持这种流程控制式的IF语法——WHERE需要的是布尔逻辑表达式来判断哪些行应该被返回,而不是像编程语言里的条件分支语句。
你转向用逻辑与/或组合的思路完全正确,只需要把没写完的部分补全就行。完整的正确SQL应该是这样的:
SELECT * FROM transactionDetails WHERE OrderID IN (400376, 400379) AND ( (TransactionDate <> ProcessingDate AND TransactionId IN (2, 3, 9, 14, 15)) OR (TransactionDate = ProcessingDate AND TransactionId IN (2, 3, 9)) );
逻辑拆解:
- 首先过滤出
OrderID是400376或400379的所有行; - 然后对这些行做分支判断:
- 如果
TransactionDate和ProcessingDate不相等,只保留TransactionId在(2,3,9,14,15)里的行; - 如果两个日期相等,就只保留
TransactionId在(2,3,9)里的行。
- 如果
如果你觉得用CASE WHEN可读性更好,也可以写成这样(逻辑完全等价,注意部分数据库可能需要微调语法):
SELECT * FROM transactionDetails WHERE OrderID IN (400376, 400379) AND TransactionId IN ( CASE WHEN TransactionDate <> ProcessingDate THEN (2, 3, 9, 14, 15) ELSE (2, 3, 9) END );
不过第一种布尔表达式的写法兼容性更强,更推荐使用。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

