Sql 当某个条件(';a&';,';b';)或者(';c';,';d';)结束时
我有一个简单的问题。这显然是无效的T-SQL语法:Sql 当某个条件(';a&';,';b';)或者(';c';,';d';)结束时,sql,tsql,Sql,Tsql,我有一个简单的问题。这显然是无效的T-SQL语法: SELECT Col1 FROM SomeTable WHERE Col2 IN CASE WHEN someCondition THEN ('a', 'b') ELSE ('c', 'd') END 做一些真正简单的事情,比如在括号中包围CASE WHEN…END块,添加SELECT关键字,将Col2 in剪切并粘贴到每个案例处理程序中,等等,效果都不是很好。老实说,这看起来应该是可行
SELECT Col1
FROM SomeTable
WHERE Col2 IN
CASE WHEN someCondition THEN
('a', 'b')
ELSE
('c', 'd')
END
做一些真正简单的事情,比如在括号中包围CASE WHEN…END
块,添加SELECT
关键字,将Col2 in
剪切并粘贴到每个案例处理程序中,等等,效果都不是很好。老实说,这看起来应该是可行的,但在SQL中,CASE
语句可能会遇到一些棘手的限制
这种语法有什么问题,如何修复?有没有什么真正的原因导致上述语法被破坏(可能导致一个小的调整来修复上述问题),或者这只是语言设计者随意“忘记”处理的事情(可能需要一个与上述完全不同的方法)
请注意,这种方法的某些应用将涉及以下形式的someCondition
:
(SELECT SomeCol FROM OtherTable WHERE id = n) = 'someVal'
我不确定在同一个查询中复制这种子选择和比较是否会导致它实际上在SQL中的每个位置都被单独调用,但即使它的调用次数与没有重复的次数一样多,但写两次仍然感觉不好。我想它可以运行一次并存储在变量中,但这也是额外的代码。更改
where
逻辑以消除案例:
where (( someCondition ) and Col2 in ('a', 'b')) or
(not ( someCondition) and Col2 in ('c', 'd') )
(此版本假定someCondition
从不NULL
)更改where
逻辑以消除情况:
where (( someCondition ) and Col2 in ('a', 'b')) or
(not ( someCondition) and Col2 in ('c', 'd') )
(此版本假定someCondition
从不NULL
)案例的结果必须是单个值
中的RHS可能是选择的结果,因此您可以执行以下操作:
declare @Which as Int = 0;
select *
from ( values ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ) ) as Things( Thing )
where Thing in (
select * from ( values ( 1 ), ( 2 ) ) as Bar( Foo ) where @Which = 0
union
select * from ( values ( 3 ), ( 4 ) ) as Bar( Foo ) where @Which = 1 )
案例的结果必须是单个值
中的RHS可能是选择的结果,因此您可以执行以下操作:
declare @Which as Int = 0;
select *
from ( values ( 0 ), ( 1 ), ( 2 ), ( 3 ), ( 4 ), ( 5 ) ) as Things( Thing )
where Thing in (
select * from ( values ( 1 ), ( 2 ) ) as Bar( Foo ) where @Which = 0
union
select * from ( values ( 3 ), ( 4 ) ) as Bar( Foo ) where @Which = 1 )