Как разделить строку, чтобы получить доступ к элементу x? - PullRequest
472 голосов
/ 05 августа 2008

Как использовать SQL Server, как разделить строку, чтобы получить доступ к элементу x?

Возьми строку "Привет, Джон Смит". Как я могу разбить строку по пробелам и получить доступ к элементу с индексом 1, который должен возвращать «Джон»?

Ответы [ 44 ]

0 голосов
/ 27 января 2019

Если подстроки не содержат дубликатов, вы можете использовать следующее:

WITH testdata(string) AS (
    SELECT 'a' UNION ALL
    SELECT 'a b' UNION ALL
    SELECT 'a b c' UNION ALL
    SELECT 'a b c d'
)
SELECT *
FROM testdata
CROSS APPLY (
    SELECT value AS substring
         , ROW_NUMBER() OVER(ORDER BY CHARINDEX(' ' + value + ' ', ' ' + string + ' ')) AS n
    FROM STRING_SPLIT(string, ' ')
) AS substrings
WHERE n = 1

STRING_SPLIT генерирует подстроки, но не обеспечивает index подстроки. Вы можете использовать CHARINDEX для генерации номера индекса, и он будет правильным, если подстроки уникальны. Это не удастся для a b b c, a b c c d e и т. Д.

0 голосов
/ 14 июля 2016
declare @strng varchar(max)='hello john smith'
select (
    substring(
        @strng,
        charindex(' ', @strng) + 1,
        (
          (charindex(' ', @strng, charindex(' ', @strng) + 1))
          - charindex(' ',@strng)
        )
    ))
0 голосов
/ 07 мая 2019

Я понимаю, что это действительно старый вопрос, но начиная с SQL Server 2016 существуют функции для анализа данных JSON, которые можно использовать для конкретного решения вопроса OP - без разделения строк или обращения к пользовательской функции. Чтобы получить доступ к элементу с определенным индексом строки с разделителями, используйте функцию JSON_VALUE. Однако необходимо правильно отформатировать данные JSON: строки должны быть заключены в двойные кавычки ", а разделитель должен быть запятой ,, а вся строка заключена в квадратные скобки [].

DECLARE @SampleString NVARCHAR(MAX) = '"Hello John Smith"';
--Format as JSON data.
SET @SampleString = '[' + REPLACE(@SampleString, ' ', '","') + ']';
SELECT 
    JSON_VALUE(@SampleString, '$[0]') AS Element1Value,
    JSON_VALUE(@SampleString, '$[1]') AS Element2Value,
    JSON_VALUE(@SampleString, '$[2]') AS Element3Value;

выход 1010 *
*

Element1Value         Element2Value       Element3Value
--------------------- ------------------- ------------------------------
Hello                 John                Smith

(1 row affected)
0 голосов
/ 01 мая 2014

Простой оптимизированный алгоритм:

ALTER FUNCTION [dbo].[Split]( @Text NVARCHAR(200),@Splitor CHAR(1) )
RETURNS @Result TABLE ( value NVARCHAR(50)) 
AS
BEGIN
    DECLARE @PathInd INT
    Set @Text+=@Splitor
    WHILE LEN(@Text) > 0
    BEGIN
        SET @PathInd=PATINDEX('%'+@Splitor+'%',@Text)
        INSERT INTO  @Result VALUES(SUBSTRING(@Text, 0, @PathInd))
        SET @Text= SUBSTRING(@Text, @PathInd+1, LEN(@Text))
    END
        RETURN 
END
...