使用 IN 的条件 WHERE 子句

Conditional WHERE clause using IN

我有一个 sql 查询,我应该有类似

的查询
select  * from transactionDetails
WHERE OrderID in (400376, 400379)
AND
    IF TransactionDate <> ProcessingDate
        TransactionId in (2,3,9,14,15)
    ELSE
        TransactionId in (2,3,9)

但这让我在 IF 和 TransactionId 处出错。

然后我试了

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)))

但这对 <> 和 = 条件给出了相同的结果 有人可以告诉我我做错了什么吗?

谢谢

把括号组织得像数学句子一样好

select  * from transactionDetails
WHERE OrderID in (400376, 400379)
AND`enter code here`
(
    (TransactionDate <> ProcessingDate AND TransactionId in (2,3,9,14,15))
    OR
  (TransactionDate = ProcessingDate AND TransactionId in (2,3,9))
)

两者不可能return相同。 <>= 是互斥的。我怀疑你的测试或理解有问题。好吧,如果其中一个日期为空,那么它们都会 return 为假。他们不可能都 return 为真。

(
    (TransactionDate <> ProcessingDate AND TransactionId in (2, 3, 9, 14, 15))
    OR
    (TransactionDate =  ProcessingDate AND TransactionId in (2, 3, 9))
)

我会在这里冒险并断言

where TransactionDate <> ProcessingDate 
  and TransactionDate =  ProcessingDate 

每次

都会 return 零行

除了上述答案之外,您可能想尝试使用 UNION ALL 而不是 OR 并检查哪个更快:

SELECT  * FROM transactionDetails
WHERE OrderID in (400376, 400379)
AND TransactionDate <> ProcessingDate 
AND TransactionId in (2,3,9,14,15)
UNION ALL
SELECT  * FROM transactionDetails
WHERE OrderID in (400376, 400379)
AND TransactionDate <> ProcessingDate 
AND TransactionDate = ProcessingDate 
AND TransactionId in (2,3,9)

您可以使用此替代解决方案。

select  * from transactionDetails
WHERE 
    OrderID in (400376, 400379)
    AND ( TransactionId in (2,3,9)
            OR ( TransactionDate <> ProcessingDate AND TransactionId IN (14,15) ) )