WHERE子句中的SQL If-Else,其条件基于列值

时间:2017-09-07 16:28:04

标签: sql sql-server tsql

如何在这个伪SQL中重写WHERE子句?

SELECT *
FROM   MyTable
WHERE  IF ( Col1 <> '' ) Col1 = @Val1
       ELSEIF ( Col2 <> '' ) Col2 = @Val2

3 个答案:

答案 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  = '')