Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当某个条件(';a&';,';b';)或者(';c';,';d';)结束时_Sql_Tsql - Fatal编程技术网

Sql 当某个条件(';a&';,';b';)或者(';c';,';d';)结束时

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剪切并粘贴到每个案例处理程序中,等等,效果都不是很好。老实说,这看起来应该是可行

我有一个简单的问题。这显然是无效的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
剪切并粘贴到每个案例处理程序中,等等,效果都不是很好。老实说,这看起来应该是可行的,但在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 )