【问题标题】:How to use conditional columns values in the same select statement?如何在同一选择语句中使用条件列值?
【发布时间】:2011-04-26 12:57:01
【问题描述】:

我有类似的东西

COMPLEX_EXPRESSION_N 代表长子查询)

select
  ID_Operation,
  FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
  SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
  ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end,
  AllChecksOk = Case WHEN 
               (FirstCheck + SecondCheck + Third CHeck = 3) 
               Then 'OK' Else 'No' End
from 
  AllOperationsTable

是否可以像我在 AllChecksOk 行中那样使用 FirstCheck、SecondCheck、ThirdCheck?

我不关心性能,这是每天在极少数记录上手动运行一次的东西,我只是想避免创建视图、表或临时表并将所有内容保存在单个 select 语句中。

作为一种替代方法,我可以这样做,但它会降低查询的可读性(因为我需要为每个复杂的表达式编写两次):

select
  ID_Operation,
  FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
  SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
  ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end,
  AllChecksOk = Case WHEN 
               (COMPLEX_EXPRESSION_1+ COMPLEX_EXPRESSION_2+ 
               COMPLEX_EXPRESSION_3CHeck = 3) Then 'OK' Else 'No' End
from 
  AllOperationsTable

【问题讨论】:

    标签: sql-server sql-server-2008 case conditional-statements


    【解决方案1】:

    您不能在 select 中引用列别名,但可以使用如下 CTE。

    ;WITH CTE AS
    (
    select
      ID_Operation,
      FirstCheck = CASE WHEN (COMPLEX_EXPRESSION_1)= 0 then 0 else 1 end,
      SecondCheck = CASE WHEN (COMPLEX_EXPRESSION_2)= 0 then 0 else 1 end,
      ThirdCheck = CASE WHEN (COMPLEX_EXPRESSION_3)= 0 then 0 else 1 end
    from 
      AllOperationsTable
    )
    SELECT *,
           AllChecksOk = Case WHEN 
                   (COMPLEX_EXPRESSION_1+ COMPLEX_EXPRESSION_2+ 
                   COMPLEX_EXPRESSION_3CHeck = 3) Then 'OK' Else 'No' End
    FROM CTE
    

    您还可以使用CROSS APPLY 定义3 个列别名,然后在主SELECT 列表as in this example 中引用它们。

    【讨论】:

    • CTE 完成了这项工作,我没有考虑 CROSS APPLY,我会为将来添加书签。谢谢。
    【解决方案2】:

    下面是派生表解决方案

    SELECT
      T.ID_Operation,
      FirstCheck   = CASE WHEN T.Expr1 = 0 THEN 0 ELSE 1 END,
      SecondCheck  = CASE WHEN T.Expr2 = 0 THEN 0 ELSE 1 END,
      ThirdCheck   = CASE WHEN T.Expr3 = 0 THEN 0 ELSE 1 END,
      AllChecksOk  = CASE WHEN T.Expr1 + T.Expr2 + T.Expr3 = 3 THEN 'OK' ELSE 'No' END
    FROM
    (
      SELECT
        ID_Operation,
        Expr1 = (COMPLEX_EXPRESSION_1),
        Expr2 = (COMPLEX_EXPRESSION_2),
        Expr3 = (COMPLEX_EXPRESSION_3)
      FROM 
        AllOperationsTable
    ) T
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-15
      • 2012-06-27
      • 2020-09-25
      • 2014-01-19
      • 2014-11-20
      • 2020-01-18
      • 2015-11-13
      • 2021-12-27
      相关资源
      最近更新 更多