使用 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) ) )
我有一个 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) ) )