我有以下查询:
DECLARE @MyTable TABLE
(
[ID] INT ,
[Col1] INT ,
[Col2] INT
)
INSERT INTO @MyTable
SELECT 1 ,
2 ,
1
UNION
SELECT 1 ,
2 ,
3
UNION
SELECT 2 ,
2 ,
3
UNION
SELECT 2 ,
2 ,
3
UNION
SELECT 3 ,
2 ,
3
UNION
SELECT 3 ,
2 ,
1
DECLARE @ID INT
SET @ID = 1
SELECT *
FROM @MyTable
WHERE ( Col1 = ( CASE WHEN [ID] = @ID THEN 2
END )
OR [Col2] = ( CASE WHEN [ID] != @ID THEN 1
END )
)
WHEN [ID] = @ID我想匹配Col1,常数值等于2,当[ID]!= @ID我希望匹配Col2时,常数值等于1.可以改进上面的查询,以便[ID]等式检查只能在上面的查询中完成一次,如下所示:
SELECT *
FROM @MyTable
WHERE
if([ID] = @ID)
Col1=2
ELSE
[Col2]=1
答案 0 :(得分:0)
这是你想要的逻辑吗?
where id = @id and col1 = 2 or
id <> @id and col2 = 1
我不知道为什么你担心这样一个条款的表现。您可以使用case
语句执行所需操作:
where 1 = (case when id = @id
then (case when col1 = 2 then 1 end)
else col2 = 1
end)
但这是一个不必要的“优化”。甚至不清楚嵌套的case
语句会比第一个版本更快。在现代计算机上,这种简单的操作确实非常快。而且,减慢数据库速度的因素是处理大量数据(一般而言),而不是简单的操作。
答案 1 :(得分:0)
也许只是:
Select *
From @MyTable
Where ((id = @id and col1 = 2) or (id <> @id and col2 = 1))