我有一个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兼容。谢谢。
答案 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, ''
,它将删除字符串的第一个字符。请注意,分号现在位于值的开头而不是结尾。
顺便说一下,将这些值存储在一行中看起来可能是个错误。也许您应该考虑让每个实体(患者可能)有一行,每种治疗类型有一行。