引用使用case语句创建的变量

时间:2019-01-12 16:27:42

标签: sql sql-server tsql

我已启动数据库并正在运行,并且可以使用SQL Server 2017 Management Studio进行一些基本选择。我现在遇到的问题是有一个表,该表根据一行中的值生成特定的结果。我有以下当前有效的代码。

我在写另一个案例时遇到了尝试引用Master_Status的问题。

基本上,我需要说一句,如果Master_Status在第一次检查后为null,然后允许它进入第二个条件,依此类推。我需要为它建立大约10个结果。

这可能吗?我应该使用参考表吗?

编辑

以下更好地代表了我的问题:我试图遍历一堆critera,以确定销售的最终状态。促销只能具有唯一状态,这就是为什么我想检查master_status是否为空。

WITH MasterStatus AS
(
    SELECT
        [Name]

    ,case WHEN  saleDate is not Null then 'outcome1'

            else NULL end as 'Master_Status'
    ,case when SaleSize is not NULL and Master_Status is Null then 
    'Outcome2'
           else NULL end as 'Master_status'
 from [AllNames]
 )
 select 
     [Name]

 from MasterStatus where Master_Status is not null 

2 个答案:

答案 0 :(得分:1)

根据查询的当前迭代情况,您似乎在CASE表达式的工作方式上苦苦挣扎。而不是尝试使用多个CASE表达式将值分配给同一列(这将不起作用),您需要一个具有多个CASE条件的WHEN表达式。

WITH MasterStatus AS
  (
    SELECT
      Name
     ,CASE
        WHEN saleDate IS NOT NULL
          THEN 'Outcome1'
        WHEN SaleSize IS NOT NULL
          THEN 'Outcome2'
        --...
        WHEN ColumnN IS NOT NULL
          THEN 'OutcomeN'
        ELSE NULL
      END AS Master_Status
    FROM
      AllNames
  )
SELECT
  Name
FROM
  MasterStatus
WHERE
  Master_Status IS NOT NULL;

将按顺序评估WHEN条件,并在第一个WHEN评估为TRUE的情况下,将相应的THEN值分配给列别名, Master_Status

答案 1 :(得分:0)

您实际上已经在使用的东西,我相信您的case语句总是正确的(因此Master_Status始终不为null。

参见下文:

declare @allnames as table ([name] int);
insert into @allnames([name])
values (1),(0)


;WITH MasterStatus as (
   select 
     [name]

    ,case WHEN  [name] = 1 then 'outcome1'

            else NULL end as 'Master_Status'
    from @allnames
 )
 select 
     [name]

 from MasterStatus where Master_Status is not null