2017-06-28 23 views
0

在視圖中,我將一個select語句放在一個案例中,並將其作爲列進行了擴展。列名是'IR2'使用Microsoft SQL在創建的列上創建案例表達式

我該如何關閉「IR2」列?

我最終得到一個錯誤,說'無效列名'IR2'。

我的選擇是什麼?

case when r.ana = 'nh3' and r.serv='energy' and exists(select 1 from results x where x.no=r.no and x.ana='nh3' and x.sa='rejected' and x.serv <> 'energy') 
then '*' else r.sa end as IR2, 

CASE IR2 WHEN 'Released' then 
'' 
ELSE 
'*' 
END AS IR 
+0

您不能在select子句中使用別名IR2 – sle1306

回答

1

CTE將是最好的選擇。如果您想繼續使用當前的聲明,則需要在其他案例聲明中添加案例聲明的副本。非常混亂的代碼。

SELECT 
case when r.ana = 'nh3' and r.serv='energy' and 
exists(select 1 from results x where x.no=r.no and x.ana='nh3' and x.sa='rejected' and x.serv <> 'energy') 
then '*' else r.sa end as IR2, 

CASE 
    (case when r.ana = 'nh3' and r.serv='energy' 
     and exists(select 1 from results x where x.no=r.no and x.ana='nh3' and x.sa='rejected' and x.serv <> 'energy') 
     then '*' else r.sa end) 
WHEN 'Released' then 
    '' 
ELSE 
    '*' 
END AS IR 
2

您可以使用子查詢或CTE。但在SQL Server的另一有趣的方式是使用outer apply

select v.IR2, 
     (case IR2 when 'Released' then '' else '*' end) as ir 
from . . . outer apply 
    (values (case when r.ana = 'nh3' and r.serv='energy' and 
         exists(select 1 from results x where x.no=r.no and x.ana='nh3' and x.sa='rejected' and x.serv <> 'energy') 
        then '*' else r.sa 
       end) 
    ) v(IR2) 
+2

IR2不是字段而是查詢中的別名。該別名只能用在'order by'子句中,而不能在select中的其他地方使用。 – sle1306

+0

@ sle1306。 。 。咦?在'FROM'子句中使用'OUTER APPLY'定義'IR2'。你的評論是錯誤的,爲什麼它會得到upvoted我不知道。 –

+0

我正在考慮問題中的原始查詢,而不是您答案中的問題。 – sle1306