简体   繁体   English

SQL Case语句以确定过滤器

[英]SQL Case Statement to Determine Filter

I am having this issue here. 我在这里有这个问题。 I am trying to use a case statement to determine which filter to use. 我正在尝试使用一个case语句来确定要使用的过滤器。 It is OK to use it for single values, but it is not OK to use a Select Statement results. 可以将其用于单个值,但不能使用Select语句结果。

DECLARE @SingleValue INT = 0

SELECT 
    t1.Field1
    , t1.Field2
    , t1.Field3
FROM 
    tblTable1 t1
    INNER JOIN tblTable2 t2 ON t1.Field1 = t2.Field
WHERE 
    t1.Field2 IN (SELECT CASE WHEN @SingleValue = 0 THEN (SELECT Field1 FROM tblTable3) ELSE t1.Field2 END)
    AND t2.Field2 = (CASE WHEN @SingleValue = 0 THEN t2.Field2 ELSE @SingleValue END)

Once the @singleValue is set to a value '123' then it is working fine, the moment when I set the value to '0' (ZERO) then it returns an error 'Subquery returned more than 1 value. 将@singleValue设置为值“ 123”后,它将工作正常,当我将值设置为“ 0”(零)时,它将返回错误“子查询返回的值大于1”。 This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.' 当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,这是不允许的。

The problem start with '(SELECT Field1 FROM tblTable3)' in the case statement. 问题从case语句中的'(SELECT Field1 FROM tblTable3)开始。 How can I work around it to get multiple values in the case statement. 我如何解决它以在case语句中获取多个值。

Thanks. 谢谢。

Maybe something like: 也许像:

DECLARE @SingleValue INT = 0

SELECT 
    t1.Field1
    , t1.Field2
    , t1.Field3
FROM 
    tblTable1 t1
    INNER JOIN tblTable2 t2 ON t1.Field1 = t2.Field
WHERE 
    (
        ( @SingleValue <> 0 )
        or
        ( t1.Field2 IN ( SELECT Field1 FROM tblTable3) )
    )
    and
    (
        ( @SingleValue = 0 )
        or
        ( t2.Field2 = @SingleValue )
    )

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM