SQL 解析分隔字符串

标签 sql sql-server tsql

我找不到一个好的方法来做到这一点,并且由于一些限制,它必须在不使用变量的情况下进行编码,但我可以调用函数。无论如何,我需要从 Select 查询返回一个结果集,其中一行是管道分隔的字符串。

因此,它会返回如下内容:

id| Name      | Message |
---------------------
1 | Some Name | 'Here is my | delimited | message'

我需要它

id| Name      | Message1     | Message2    | Message3
------------------------------------------------------
1 | Some Name | 'Here is my' | 'delimited' | 'message'

我正在考虑类似 Parsename('','|',1) 的东西,您可以在其中传递分隔符,而不是始终使用句点,但我不知道最好的实现这一目标的方法。

编辑:我尝试过这种方法的变体,但当然它非常令人困惑。可能有 4 个或更多 |

SELECT Field1, 
Field2 AS Originalvalue,
--1
SUBSTRING(Field2,0,CHARINDEX('|',Field2)) AS Msg1,
--2
LEFT(SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)),CHARINDEX('|',SUBSTRING(Field2,CHARINDEX('|',Field2)+1 ,LEN(Field2)))-1)
AS ExtractedValue
FROM Table1 T1 JOIN Table2 T2
ON T1.Id = T2.Id
WHERE T1.Id = 12

最佳答案

您可以编写一个sql函数,如下所示。

create Function dbo.fn_Parsename(@Message Varchar(1000), @delimiter char(1), @index int )
Returns Varchar(1000)
As
Begin
    Declare
        @curIndex int = 0,
        @pos int = 1,
        @prevPos int = 0,
        @result varchar(1000)

    while @pos > 0
    Begin

        set @pos =  CHARINDEX(@delimiter, @Message, @prevPos);

        if(@pos > 0)
        begin-- get the chars between the prev position to next delimiter pos
            set @result = SUBSTRING(@message, @prevPos, @pos-@prevPos)
        end
        else
        begin--get last delim message
            set @result = SUBSTRING(@message, @prevPos, LEN(@message))
        end

        if(@index = @curIndex)
        begin
            return @result
        end

        set @prevPos = @pos + 1
        set @curIndex = @curIndex + 1;

    end
    return ''--not found
End

您可以按如下方式调用它:

select dbo.fn_Parsename('Here is my | delimited | message','|', 0)
select dbo.fn_Parsename('Here is my | delimited | message','|', 1)
select dbo.fn_Parsename('Here is my | delimited | message','|', 2)

关于SQL 解析分隔字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7924254/

相关文章:

SQL 查询以确定列中的值是唯一的

sql-server - 使用触发器查明插入、更新或删除了哪些行

tsql - 在转换为 int 的列上将 varchar 转换为 int 失败

sql-server - 每个 N 的最新记录的最佳执行查询

mysql - cron 作业任务的日期时间问题

sql-server - 如何使用 SQL Server 中另一列的数据更新一列?

mysql - 重音词不敏感搜索

sql-server - SQL Server 分组依据/排序依据

mysql - 为大表放置哪些 SQL 索引

mysql - SQL 仅在以下情况下插入