猿问

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

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

使用SQL Server,如何拆分字符串以便访问项目x?

拿一个字符串“Hello John Smith”。如何按空格分割字符串并访问索引1处应该返回“John”的项目?


收到一只叮咚
浏览 531回答 4
4回答

慕田峪7331174

您可以在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

呼啦一阵风

我不相信SQL Server有内置的拆分功能,所以除了UDF之外,我知道的唯一其他答案是劫持PARSENAME函数:SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 2)PARSENAME接受一个字符串并将其拆分为句点字符。它需要一个数字作为它的第二个参数,并且该数字指定要返回的字符串的哪个段(从后到前工作)。SELECT PARSENAME(REPLACE('Hello John Smith', ' ', '.'), 3)  --return Hello显而易见的问题是字符串已经包含句点。我仍然认为使用UDF是最好的方法......任何其他建议?

BIG阳

首先,创建一个函数(使用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 tableASreturn (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 sfrom tokens);GO用法保持不变。
随时随地看视频慕课网APP

相关分类

MySQL
我要回答