Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在同一select语句中使用条件列值?_Sql Server_Sql Server 2008_Case_Conditional Statements - Fatal编程技术网

Sql server 如何在同一select语句中使用条件列值?

Sql server 如何在同一select语句中使用条件列值?,sql-server,sql-server-2008,case,conditional-statements,Sql Server,Sql Server 2008,Case,Conditional Statements,我有点像 (COMPLEX\u EXPRESSION\u N表示长子查询) 是否可以像我在AllChecksOk行中那样使用FirstCheck、SecondCheck、ThirdCheck 我不关心性能,这是一种每天手动运行一次的操作,只需要很少的记录,我只是想避免创建视图、表或临时表,并将所有内容保存在一个select语句中 作为替代,我可以这样做,但这会降低查询的可读性(因为我需要为每个复杂表达式编写两次): 您不能在选择中引用列别名,但可以使用如下CTE ;WITH CTE AS ( s

我有点像

COMPLEX\u EXPRESSION\u N
表示长子查询)

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

我不关心性能,这是一种每天手动运行一次的操作,只需要很少的记录,我只是想避免创建视图、表或临时表,并将所有内容保存在一个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

您还可以使用
交叉应用
定义3列别名,然后在主
选择
列表中引用它们。

下面是一个派生表解决方案

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

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