为了账号安全,请及时绑定邮箱和手机立即绑定

如何拆分字符串以便我可以访问项目x?

如何拆分字符串以便我可以访问项目x?

收到一只叮咚 2019-05-22 15:37:37
如何拆分字符串以便我可以访问项目x?使用SQL Server,如何拆分字符串以便访问项目x?拿一个字符串“Hello John Smith”。如何按空格分割字符串并访问索引1处应该返回“John”的项目?
查看完整描述

4 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

您可以在SQL用户定义函数中找到解析分隔字符串的解决方案(来自代码项目)。

你可以使用这个简单的逻辑:

Declare @products varchar(200) = '1|20|3|343|44|6|8765'Declare @individual varchar(20) = nullWHILE LEN(@products) > 0BEGIN
    IF PATINDEX('%|%', @products) > 0
    BEGIN
        SET @individual = SUBSTRING(@products,
                                    0,
                                    PATINDEX('%|%', @products))
        SELECT @individual        SET @products = SUBSTRING(@products,
                                  LEN(@individual + '|') + 1,
                                  LEN(@products))
    END
    ELSE
    BEGIN
        SET @individual = @products        SET @products = NULL
        SELECT @individual    ENDEND


查看完整回答
反对 回复 2019-05-22
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

我不相信SQL Server有内置的拆分功能,所以除了UDF之外,我知道的唯一其他答案是劫持PARSENAME函数:

SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2)

PARSENAME接受一个字符串并将其拆分为句点字符。它需要一个数字作为它的第二个参数,并且该数字指定要返回的字符串的哪个段(从后到前工作)。

SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 3)  --return Hello

显而易见的问题是字符串已经包含句点。我仍然认为使用UDF是最好的方法......任何其他建议?


查看完整回答
反对 回复 2019-05-22
?
BIG阳

TA贡献1859条经验 获得超6个赞

首先,创建一个函数(使用CTE,公共表表达式不需要临时表)


 create function dbo.SplitString 

    (

        @str nvarchar(4000), 

        @separator char(1)

    )

    returns table

    AS

    return (

        with tokens(p, a, b) AS (

            select 

                1, 

                1, 

                charindex(@separator, @str)

            union all

            select

                p + 1, 

                b + 1, 

                charindex(@separator, @str, b + 1)

            from tokens

            where b > 0

        )

        select

            p-1 zeroBasedOccurance,

            substring(

                @str, 

                a, 

                case when b > 0 then b-a ELSE 4000 end) 

            AS s

        from tokens

      )

    GO

然后,将它用作任何表(或修改它以适合您现有的存储过程),就像这样。


select s 

from dbo.SplitString('Hello John Smith', ' ')

where zeroBasedOccurance=1

更新


对于长度超过4000个字符的输入字符串,以前的版本将失败。此版本负责限制:


create function dbo.SplitString 

(

    @str nvarchar(max), 

    @separator char(1)

)

returns table

AS

return (

with tokens(p, a, b) AS (

    select 

        cast(1 as bigint), 

        cast(1 as bigint), 

        charindex(@separator, @str)

    union all

    select

        p + 1, 

        b + 1, 

        charindex(@separator, @str, b + 1)

    from tokens

    where b > 0

)

select

    p-1 ItemIndex,

    substring(

        @str, 

        a, 

        case when b > 0 then b-a ELSE LEN(@str) end) 

    AS s

from tokens

);


GO

用法保持不变。


查看完整回答
反对 回复 2019-05-22
  • 4 回答
  • 0 关注
  • 530 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信