我们有一个包含三个字段的结果集,每个字段要么为空,要么包含逗号分隔的字符串列表。
我们需要将所有三个组合成一个逗号分隔的列表并消除重复项。
最好的方法是什么?
我找到了一个很好的函数,可以拆分字符串并返回一个表:
我尝试创建一个 UDF,它需要三个 varchar 参数并调用该拆分字符串函数三次,将它们组合到一个表中,然后从那里使用 FOR XML 并将其作为一个逗号分隔的字符串返回。
但是 SQL 抱怨在函数中有一个 SELECT。
我们有一个包含三个字段的结果集,每个字段要么为空,要么包含逗号分隔的字符串列表。
我们需要将所有三个组合成一个逗号分隔的列表并消除重复项。
最好的方法是什么?
我找到了一个很好的函数,可以拆分字符串并返回一个表:
我尝试创建一个 UDF,它需要三个 varchar 参数并调用该拆分字符串函数三次,将它们组合到一个表中,然后从那里使用 FOR XML 并将其作为一个逗号分隔的字符串返回。
但是 SQL 抱怨在函数中有一个 SELECT。
这是使用您引用的 SplitString 函数的示例。
DECLARE
@X varchar(max) = 'A, C, F'
, @Y varchar(max) = null
, @Z varchar(max) = 'A, D, E, A'
;WITH SplitResults as
(
-- Note: the function does not remove leading spaces.
SELECT LTRIM([Name]) [Name] FROM SplitString(@X)
UNION
SELECT LTRIM([Name]) [Name] FROM SplitString(@Y)
UNION
SELECT LTRIM([Name]) [Name] FROM SplitString(@Z)
)
SELECT STUFF((
SELECT ', ' + [Name]
FROM SplitResults
FOR XML PATH(''), TYPE
-- Note: here we're pulling the value out in case any characters were escaped, ie. &
-- and then STUFF is removing the leading ,<space>
).value('.', 'nvarchar(max)'), 1, 2, '')
我不会将数据作为逗号分隔的字符串存储在单个字段中。将字符串分离到一个新表中,并在需要时将其再次组合成一个字符串。
查找重复数据和管理数据也将容易得多。
我以前使用过这个函数(我没有写它,不幸的是我不记得我在哪里找到它)来分割一个字符串并将一个键(在本例中为一个int
)作为一个单独的表添加到数据中,链接回原表的PK
CREATE FUNCTION SplitWithID (@id int, @sep VARCHAR(10), @s VARCHAR(MAX))
RETURNS @t TABLE
(
id int,
val VARCHAR(MAX)
)
AS
BEGIN
DECLARE @xml XML
SET @XML = N'<root><r>' + REPLACE(@s, @sep, '</r><r>') + '</r></root>'
INSERT INTO @t(id,val)
SELECT @id, r.value('.','VARCHAR(40)') as Item
FROM @xml.nodes('//root/r') AS RECORDS(r)
RETURN
END
GO
将数据放在单独的行上后,您可以在将主键应用于表之前使用任何重复删除技术来清理数据。