2016-07-26 130 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'