【问题标题】:T-SQL | Conditions in Where ClauseT-SQL | Where 条款中的条件
【发布时间】:2017-12-19 11:41:55
【问题描述】:

我有一个整数参数 -> @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

我该怎么做?

谢谢!

【问题讨论】:

  • This 答案显示了如何在JOINWHERE 中使用CASE 表达式。安迪的回答仍然是表达你意图的更清晰的方式。

标签: sql sql-server tsql conditional-statements


【解决方案1】:

您不能将单个值与设置为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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-28
      • 2011-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多