我在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
答案 0 :(得分:8)
在这个例子中,你根本不需要CASE
。 AND
和OR
运行得更快:
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
的值不需要为每一行重新评估。)