SQL Case语句来确定过滤器

时间:2016-01-29 08:32:27

标签: sql sql-server

我在这里遇到这个问题。我试图使用case语句来确定使用哪个过滤器。将它用于单个值是可以的,但是使用Select Statement结果是不行的。

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)

将@singleValue设置为值' 123'然后它工作正常,我将值设置为' 0' (ZERO)然后它返回一个错误'子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。'

问题始于'(SELECT Field1 FROM tblTable3)'在案例陈述中。我如何解决它在case语句中获取多个值。

感谢。

1 个答案:

答案 0 :(得分:0)

可能是这样的:

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 )
    )