2016-07-26 151 views
0

我有以下SELECT在SQL Server 2008中工作得很好的語句。現在,我不需要返回最多4行,而是需要將結果連接到單個結果/行。連接多個case語句

正如您可以推斷,這個腳本檢查藥物表,如果藥物匹配,它將CASE作爲結果。

我已經在開始時加入了DISTINCT,最後加入了IS NOT NULL以最大限度地減少每種不匹配藥物或多種匹配藥物(即糖尿病,糖尿病)的NULL結果。

所有行都包含varchar數據。

我試過CONCAT()COALESCE()盡我所能並且每次都做得很短。

現有的查詢,返回多行正確的結果是:

Select DISTINCT a.conditions 
from 
    (select 
     CASE 
      WHEN medication like 'caduet' 
       THEN 'Hypertension and Cholesterol' 
      WHEN medication like '%actoplus%' 
           OR medication like '%actos%' 
           OR medication like '%amaryl%' 
       THEN 'Diabetes' 
      WHEN medication like '%altocor%' 
           OR medication like '%altoprev%' 
           OR medication like '%zocor%' 
       THEN 'Cholesterol' 
      WHEN medication like '%-nitro%' 
           OR medication like '%accupril%' 
           OR medication like '%zosin%' 
       THEN 'Hypertension' 
      ELSE NULL 
     END as Conditions 
    from 
     prescriptions 
    where 
     patientid = @contactid 
     and status = 'Active') a 
where 
    a.conditions is not null 

謝謝!

+0

所以如果一個救護有一個像'阿司匹林actoplus-nitro'一個名字,你想輸出'阿司匹林糖尿病hypertension'? –

+0

否。當匹配時,它輸出Then子句。現有的腳本將每個輸出到一個單獨的行。我需要他們合併。接受的答案作爲獨立的解決方案工作,但最好將它們作爲4個單獨的CASE(),每個嵌套在MAX()中,這樣我就可以將查詢嵌入到執行其他操作的更大的查詢中。 –

回答

0

可以使用for xml path它們串聯在一起。確切的語法多一點參與:

with t as (<your query here>) 
select stuff((select ',' + conditions 
       from t 
       for xml path(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)' 
        ), 1, 1, ''); 
+0

這可以作爲獨立查詢使用。當我嘗試將它作爲一個元素添加到一個更大的select語句中(並將其併入存儲過程)時,它會崩潰。我知道前面的語句,因爲xlmnamespaces,必須以分號結尾,但是沒有以前的語句。 –

0

可以使用STUFF

(Select DISTINCT a.conditions = STUFF(
         (SELECT ',' + CASE 
          WHEN medication like 'caduet' 
          THEN 'Hypertension and Cholesterol' 
          WHEN medication like '%actoplus%' 
           OR medication like '%actos%' 
           OR medication like '%amaryl%' 
          THEN 'Diabetes' 
          WHEN medication like '%altocor%' 
           OR medication like '%altoprev%' 
           OR medication like '%zocor%' 
          THEN 'Cholesterol' 
          WHEN medication like '%-nitro%' 
           OR medication like '%accupril%' 
           OR medication like '%zosin%' 
          THEN 'Hypertension' 
          ELSE NULL 
          END as Conditions 
         from prescriptions 
         where patientid = @contactid 
         and status = 'Active' 
         ) a 
         where a.conditions is not null)) as 'Conditions'