连接三个 varchar 字段的最佳方法是什么,每个字段要么为 null 要么包含逗号分隔的字符串



我们有一个结果集,其中包含三个字段,每个字段要么为 null,要么包含逗号分隔的字符串列表。

我们需要将所有三个合并为一个逗号分隔的列表并消除重复项。

最好的方法是什么?

我找到了一个很好的函数,可以拆分字符串并返回一个表:

T-SQL 拆分字符串

我尝试创建一个 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

将数据放在单独的行上后,可以使用任何重复删除技术在将主键应用于表之前清理数据。

最新更新