如何在这个伪SQL中重写WHERE子句?
SELECT *
FROM MyTable
WHERE IF ( Col1 <> '' ) Col1 = @Val1
ELSEIF ( Col2 <> '' ) Col2 = @Val2
答案 0 :(得分:4)
伪代码的正确等效词是:
emailAddress = emailAddress.replace(/@/g, '<span>@</span>').replace(/@/g, '<span>@</span>')
这是按优先顺序排列的,首先是WHERE (Col1 <> '' AND Col1 = @Val1) OR
(Col1 = '' AND Col2 <> '' AND Col2 = @Val2)
,然后是Col1
。当Col2
为空字符串时,它只会移至Col2
。
注意:此版本假定Col1
不是Col1
。如果您需要支持NULL
值,可以很容易地将其合并到逻辑中 - 尤其是在如何处理它们时提供一些指导。
答案 1 :(得分:0)
嗯,可以使用CASE函数执行类似的操作:
SELECT *
FROM MyTable
WHERE 1 = CASE WHEN Col1 <> '' THEN CASE WHEN Col1 = @Val1 THEN 1 END
WHEN Col2 <> '' THEN CASE WHEN Col2 = @Val2 THEN 1 END
END
案例函数返回一个值。因此,当1 = 1时,满足条件。由于省略了案例的ELSE部分,因此在不满足条件时返回NULL。由于1 = null永远不会为真,因此不会满足WHERE条件。
有时,这样的代码所增加的额外复杂性是不合理的 - 在检查性能等之后,这将取决于您的确切情况。
编辑:添加ELSE部分。这些不是必需的,但可能会让一些人更清楚。SELECT *
FROM MyTable
WHERE 1 = (CASE WHEN Col1 <> '' THEN (CASE WHEN Col1 = @Val1 THEN 1 ELSE 0 END)
WHEN Col2 <> '' THEN (CASE WHEN Col2 = @Val2 THEN 1 ELSE 0 END)
ELSE 0
END)
答案 2 :(得分:-1)
假设我正确理解你的逻辑。 您希望匹配col1 = @ val1或col1是空字符串 OR col2 = @ val2或col2是一个空白字符串。
SELECT *
FROM MyTable
WHERE (Col1 = @Val1 OR Col1 = '' )
OR (Col2 = @Val2 OR Col2 = '')