MSSQL上的WHERE子句中的CASE语法

时间:2011-04-23 15:14:44

标签: sql sql-server tsql

我在MSSQL上有以下SQL语法

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE
  ((CASE WHEN @Filter = 'firstName' THEN @Value END) = firstName ) or
  ((CASE WHEN @Filter = 'lastName' THEN @Value END) = lastName ) 

它正在运作,但我不知道是否有更好,更有效的方法来做到这一点。

感谢advanceName

2 个答案:

答案 0 :(得分:8)

在这个例子中,你根本不需要CASEANDOR运行得更快:

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE
  (@Filter = 'firstName' AND @Value = firstName) OR
  (@Filter = 'lastName' AND @Value = lastName)

答案 1 :(得分:5)

这可能会编译,但似乎缺少某些东西。 @Filter显然代表了您正在过滤的字段,人们希望看到来检查该字段,就像这样

SELECT
  id,
  firstName,
  lastName
FROM
  Person
WHERE @Value =
   CASE WHEN @Filter = 'firstName' THEN firstName
        WHEN @Filter = 'lastName' THEN lastName
    END

如果这是你的意图,那么只需要一个CASE表达式,无论可能的过滤字段数量如何。

无论哪种方式,CASE语句都会非常有效。 SQL Server将看到WHEN表达式正在比较标量值并相应地进行优化(换句话说,@Filter的值不需要为每一行重新评估。)