带有基于列值的条件的 WHERE 子句中的 SQL If-Else

Nic*_*rie 1 sql t-sql sql-server

您将如何重写此伪 SQL 中的 WHERE 子句?

SELECT *
FROM   MyTable
WHERE  IF ( Col1 <> '' ) Col1 = @Val1
       ELSEIF ( Col2 <> '' ) Col2 = @Val2
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

您的伪代码的正确等效项是:

WHERE (Col1 <> '' AND Col1 = @Val1) OR
      (Col1 = '' AND Col2 <> '' AND Col2 = @Val2)
Run Code Online (Sandbox Code Playgroud)

这按优先级顺序匹配,首先是 on Col1,然后是 on Col2。它只移动到Col2whenCol1是一个空字符串。

注意:此版本假定Col1不是NULL. 如果您需要支持NULL值,那么这可以很容易地合并到逻辑中——尤其是关于如何处理它们的一些指导。