在MS SQL中分隔一列中的多个值

时间:2012-12-05 16:44:10

标签: sql sql-server

我在应用程序中有一个字段,允许用户选择多个值。当我在DB中查询此字段时,如果选择了多个值,则结果将显示为一个长字。多个选定值之间没有逗号或空格。这些值是否可以用逗号分隔? 这是我的疑问:

SELECT      HO.Value

FROM HAssessment ha 
INNER JOIN HObservation HO       
ON HO.AssessmentiD      = ha.AssessmentID
AND HO.Patient_Oid      = 2255231
WHERE Ho.FindingAbbr = 'A_R_CardHx'

------------------------------------------------
Result:
AnginaArrhythmiaCADCChest Pain
-------------------------
I would like to see:
Angina, Arrhythmia, CADC, Chest Pain
------------------------------------------

帮助!

1 个答案:

答案 0 :(得分:0)

对此没有简单的解决方案。

最权宜的是编写字符串拆分功能。从您的示例数据中,似乎所有值都连接在一起而没有任何分隔符。这意味着您必须提供所有可能值的列表(希望这是来自某些症状表的查询...)并从字符串中解析出每个值。这将是复杂和痛苦的。

一种直接的方法是测试每个有效的症状值,看它是否包含在HObservation.Value中,将所有找到的值填充在一起,然后返回结果。请注意,这将表现得非常糟糕。

以下是TSQL中的一个示例。不过,在应用程序层执行此操作会好得多,或者更好的是,规范化数据库(有关详细信息,请参阅下文)。

declare @symptoms table (symptom varchar(100))
insert into @symptoms (symptom)
values ('Angina'),('Arrhythmia'),('CADC'),('Chest Pain')

declare @value varchar(100)
set @value = 'AnginaArrhythmiaCADCChest Pain'

declare @result varchar(100)
select @result = stuff((
SELECT ', ' + s.symptom
FROM @symptoms s
WHERE patindex('%' + s.symptom + '%',@value) > 0
FOR XML PATH('')),1,1,'')

select @result

真正的答案是重构数据库。如果这样的表已经不存在,将HObservation.Value中的每个不同项目(这意味着心绞痛,心律失常等作为单独的行)放入其他表中。我将此表称为症状。然后创建一个查找表,将HObservationSymptom相关联。然后完全删除HObservation.Value列。拆分在应用程序级别进行,并在查找表中进行多次插入。

示例,基于您问题的样本数据:

HObservation
------------
ID Value
1  AnginaArrhythmiaCADC

变为:

HObservation
------------
ID 
1  

Symptom
-------
ID Value
1  Angina
2  Arrhythmia
3  CADC

HObservationSymptom
-------------------
ID HObservationID SymptomID
1  1              1
1  1              2
1  1              3

请注意,如果这是一个生产系统(或者您想因某些其他原因保留现有数据),您仍然需要编写代码来进行字符串拆分。