【问题标题】:Splitting of comma separated values [duplicate]逗号分隔值的拆分[重复]
【发布时间】:2011-07-26 04:03:29
【问题描述】:

我有一些带有逗号分隔值的列。例如

一个

as,ad,af,ag

我的经理希望输出如下所示:


A

as                          

ad          

af          

ag  

所有这些都应该在一行之下。我想我们需要使用一些换行符。

嗨,我们可以用 char(13)+char(10) 替换吗?这个也可以。。。

谢谢, 沙什拉

【问题讨论】:

标签: sql sql-server sql-server-2005 tsql ssms


【解决方案1】:

您可以创建一个用户定义的 UDF,如下所示。然后,只需从另一个查询中传入逗号分隔的列表,它就会返回一个表,其中每个值都位于单独的行中。

CREATE FUNCTION [dbo].[fnSplitStringAsTable] 
(
    @inputString varchar(MAX),
    @delimiter char(1) = ','
)
RETURNS 
@Result TABLE 
(
    Value varchar(MAX)
)
AS
BEGIN
    DECLARE @chIndex int
    DECLARE @item varchar(100)

    -- While there are more delimiters...
    WHILE CHARINDEX(@delimiter, @inputString, 0) <> 0
        BEGIN
            -- Get the index of the first delimiter.
            SET @chIndex = CHARINDEX(@delimiter, @inputString, 0)

            -- Get all of the characters prior to the delimiter and insert the string into the table.
            SELECT @item = SUBSTRING(@inputString, 1, @chIndex - 1)

            IF LEN(@item) > 0
                BEGIN
                    INSERT INTO @Result(Value)
                    VALUES (@item)
                END

            -- Get the remainder of the string.
            SELECT @inputString = SUBSTRING(@inputString, @chIndex + 1, LEN(@inputString))
        END

    -- If there are still characters remaining in the string, insert them into the table.
    IF LEN(@inputString) > 0
        BEGIN
            INSERT INTO @Result(Value)
            VALUES (@inputString)
        END

    RETURN 
END

【讨论】:

    【解决方案2】:

    在不使用用户定义函数的情况下进行检查

    DECLARE @param VARCHAR(MAX)
    SET @param = 'as,ad,af,ag'
    
    SELECT Split.a.value('.', 'VARCHAR(100)') AS ColName  
    FROM  
    (
         SELECT CONVERT(XML, '<M>' + REPLACE(ColName, ',', '</M><M>') + '</M>') AS ColName  
         FROM  (SELECT @param AS ColName) TableName
     ) AS A CROSS APPLY ColName.nodes ('/M') AS Split(a)
    

    【讨论】:

    • 这是我需要的解决方案,因为我没有修改数据库架构的权限。
    【解决方案3】:

    您想使用字符串拆分功能,例如 here

    创建此函数后,您可以:

    select string as A
        from YourTable
            cross apply dbo.fnParseStringTSQL(A,',')
    

    【讨论】:

    • 我试过这样,但它不起作用。它显示所有这 3 个逗号分隔值 3 次(意味着显示 3 个具有相同值的重复行)......
    • @Shahsra:您能否提供有关您正在测试的数据的更多详细信息?
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多