通过case语句进行SQL连接

时间:2014-02-06 16:25:42

标签: sql sql-server

我有一个CASE声明如下。 这将创建一个由两个字符串组成的字符串,根据需要用分号分隔,并通过自定义函数删除尾部分号。

    CASE 
        WHEN ISNULL(mcp.N5_5_CARE_INTENT,'') <> 'X'
        THEN
        NULLIF(dbo.RemoveLastCharacter
        (COALESCE(mcp.N5_6_TREATMENT_TYPE_1 + ';','') + 
        COALESCE(mcp.N5_6_TREATMENT_TYPE_2 + ';','') +
        COALESCE(mcp.N5_6_TREATMENT_TYPE_3 + ';','') +
        COALESCE(mcp.N5_6_TREATMENT_TYPE_4 + ';','')),'')
        ELSE NULL
        END PlannedTreatmentType

但这还远远不够,因为我希望两个字符子串和最终的连接只包括:

    '01', '02', '03', '05', '06'

如果有一个不是其中之一的子字符串,则应返回NULL。

例如

    01;05;06

很好,所以

    06;01

    01;07

    09;08su

不好

这必须与SQL2000兼容。谢谢。

1 个答案:

答案 0 :(得分:0)

在将每个值放入字符串之前,您需要对其进行测试。此外,您可以使用stuff()方法而不是您的功能。

(CASE WHEN ISNULL(mcp.N5_5_CARE_INTENT,'') <> 'X'
      THEN stuff((case when mcp.N5_6_TREATMENT_TYPE_1 in ('01', '02', '03', '05', '06')
                       then ';'+mcp.N5_6_TREATMENT_TYPE_1 
                       else ''
                   end) +
                 (case when mcp.N5_6_TREATMENT_TYPE_2 in ('01', '02', '03', '05', '06')
                       then ';'+mcp.N5_6_TREATMENT_TYPE_2
                       else ''
                   end) +
                 (case when mcp.N5_6_TREATMENT_TYPE_3 in ('01', '02', '03', '05', '06')
                       then ';'+mcp.N5_6_TREATMENT_TYPE_3
                       else ''
                   end) +
                 (case when mcp.N5_6_TREATMENT_TYPE_4 in ('01', '02', '03', '05', '06')
                       then ';'+mcp.N5_6_TREATMENT_TYPE_4 
                       else ''
                   end)
                ), 1, 1, '')
     ELSE NULL
 END) as PlannedTreatmentType

stuff()用另一个值替换任意字符序列。使用参数1, 1, '',它将删除字符串的第一个字符。请注意,分号现在位于值的开头而不是结尾。

顺便说一下,将这些值存储在一行中看起来可能是个错误。也许您应该考虑让每个实体(患者可能)有一行,每种治疗类型有一行。