T-SQL |条款

时间:2017-07-14 11:25:39

标签: sql sql-server tsql conditional-statements

我有一个整数参数 - > @Flag和我有一个这种结构的表:

ID     Date    Value_A  Value_B Value_C
A   2017-07-14  1          1       1
A   2017-07-13  1          0       1
A   2017-07-12  1          0       1

我想要的是:   - 如果参数@Flag是> 0然后获取Value_A,Value_B或Value_C不具有相同值的行。在上面的示例中,如果@Flag为1,则返回第二行和第三行。   - 如果参数@Flag = 0,则返回所有行。

我正在尝试使用此脚本,但我在子查询中遇到错误:

  

子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

DECLARE @Flag INT
SET @Flag = NULL

SELECT *
FROM teste
WHERE Value_A = CASE  
                  WHEN @Flag > 0 THEN 
                   (SELECT Value_B FROM teste WHERE Value_A <> Value_B or Value_A <> Value_C) 
                  ELSE (SELECT Value_A FROM teste) 
                END

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:2)

您无法将单个值与设置为Value_A = (some set of values)进行比较。

但在您的特定情况下根本不需要它,因为您的查询可以简化为:

SELECT *
FROM teste
where
    (@Flag > 0 and ( Value_A <> Value_B or Value_A <> Value_C))
    or @Flag = 0

答案 1 :(得分:0)

假设值不是NULL,您只关心标志为0或不为零:

SELECT *
FROM teste
WHERE @Flag = 0 OR
      (Value_A <> Value_B OR Value_A <> Value_C)