Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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 基于标志的Where子句中的条件_Sql_Tsql - Fatal编程技术网

Sql 基于标志的Where子句中的条件

Sql 基于标志的Where子句中的条件,sql,tsql,Sql,Tsql,我可以使用标志选择不同的WHERE子句吗?像这样的 SELECT fields from T3 t3 left outer join T1 t1 on T1.Id=t2.Id WHERE CASE WHEN @Status <> 1 THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1) ELSE t2.Id = @SID AND t2.StatusID

我可以使用标志选择不同的WHERE子句吗?像这样的

SELECT  fields
 from T3 t3 
left outer join T1 t1 on T1.Id=t2.Id
WHERE 
    CASE 
        WHEN @Status <> 1 
        THEN (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
        ELSE t2.Id = @SID AND  t2.StatusID = 12
GROUP BY whatever
选择字段
从T3到T3
T1上的左外连接T1.Id=t2.Id
哪里
案例
当@Status 1
然后(t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
ELSE t2.Id=@SID和t2.StatusID=12
按什么分组

为什么您需要CASE WHEN?你能在状态1和。。。或者…?

您可以-只需在
案例中添加一个
结尾

SELECT  fields
FROM    T3 t3 
LEFT OUTER JOIN T1 t1 on T1.Id=t2.Id
WHERE 
        CASE 
          WHEN @Status <> 1 THEN 
            (t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
           ELSE 
            t2.Id = @SID AND  t2.StatusID = 12
        END
GROUP BY whatever
选择字段
从T3到T3
T1上的左外连接T1.Id=t2.Id
哪里
案例
当@Status 1时,则
(t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
其他的
t2.Id=@SID和t2.StatusID=12
结束
按什么分组

当然可以
CASE
返回一个值,因此用法如下:

where case
  when @Mode = 1 and A.Foo = B.Foo then 1
  when @Mode = 2 and A.Foo > B.Foo + 5 then 1
  when A.Bar < @Mode then 1
  else 0
  end = 1
where case
当@Mode=1且A.Foo=B.Foo时,则为1
当@Mode=2且A.Foo>B.Foo+5时,则为1
当A.Bar<@模式时,则为1
其他0
结束=1
首选方式:

    WHERE
    (@Status <> 1 AND t3.Id = @SId AND sh.StatusId = 3 AND k.StatusId = 1)
    OR (t2.Id = @SID AND t2.StatusID = 12)
在哪里
(@Status 1和t3.Id=@SId和sh.StatusId=3和k.StatusId=1)
或者(t2.Id=@SID和t2.StatusID=12)
或者这是一个更容易阅读的案例陈述:

WHERE
CASE WHEN @Status <> 1 
       AND t3.Id = @SId 
       AND sh.StatusId = 3 
       AND k.StatusId = 1 THEN 1
WHEN t2.Id = @SID 
       AND t2.StatusID = 12 THEN 1
ELSE 0 END = 1
在哪里
状态1时的情况
和t3.Id=@SId
和sh.StatusId=3
k.StatusId=1,然后是1
当t2.Id=@SID时
t2.StatusID=12,然后是1
否则0结束=1

我认为@JBrooks没有正确地翻译您的案例陈述(令人担忧的是,可能会导致误报)

我认为
案例
的等价物如下:

WHERE 1 = CASE 
             WHEN @Status <> 1 
             THEN CASE 
                     WHEN (t3.Id = @SID AND sh.StatusId = 3 AND k.StatusId = 1) 
                     THEN 1 
                  END
             ELSE CASE 
                     WHEN t2.Id = @SID AND t2.StatusID = 12 
                     THEN 1 
                  END 
          END

您从T3中选择并加入T1,其中T1=T2,但您在任何地方都没有加入T2?你丢失密码了吗?是的!!对不起,我打错了。我也在做同样的事情,但是得到了一个解析错误。“=”附近的语法不正确。在WHERE语句中..您是否在查询中加入T2?如果是这样的话,你能编辑问题并发布完整的查询吗?它也不适用于END。。在WHERE语句中获取解析器错误。“=”附近的语法不正确查询未完成-别名
t2
无法解析。我只是复制了您的代码并添加了
结尾
,以解释必要的语法更改。@user424134:我认为这些
WHERE
子句都没有遵循问题中的逻辑,并且都会导致“误判”错误。看到我的答案了吗?@有一天,我同意我的答案与他的原稿不符,但他在与原稿抗争,我认为这可能是他逻辑上想要的。如果没有,写得更清楚将有助于他找到正确的逻辑。
WHERE
( p.Status = 1 OR ( t3.Id = p.SID AND sh.StatusId = 3 AND k.StatusId = 1 ) )
AND
( p.Status <> 1 OR ( t2.Id = p.SID AND t2.StatusID = 12 ) )