Извлечь все символы после значения позиции или индекса в SQL Server - PullRequest
0 голосов
/ 10 октября 2018

Ниже приведен пример данных

100231|ABC Limited||Liquidated|514321||AU||Testwood|5165|5/14/1996 12:00:00 AM|8/1/2003 12:00:00 AM|Test1|Test2|

Я хочу извлечь все данные после позиции 12 из '|'разделитель канала с использованием функций SQL Server, т. е. выходные данные должны быть |Test1|Test2|

Я пробовал использовать следующее:

Select RIGHT(@InputValue,CHARINDEX('|',REVERSE(@InputValue))-1)

Но он не дает требуемого вывода.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Вы также можете использовать рекурсивный CTE для этого.

Позвольте ему вычислить позиции разделителей.
Затем выберите подстроку на основе вычисленных позиций.

WITH CTE AS
(
  SELECT 
  1 as FieldNr,
  -- LEFT(@InputValue,CHARINDEX('|', @InputValue)-1) AS Field,
  0 as Pos1, 
  CHARINDEX('|',@InputValue) as Pos2

  UNION ALL

  SELECT 
  FieldNr+1,
  -- SUBSTRING(@InputValue, Pos2+1, CHARINDEX('|',@InputValue, Pos2+1)-Pos2-1), 
  Pos2, 
  CHARINDEX('|',@InputValue, Pos2+1)
 FROM CTE
 WHERE Pos2 > 0 AND Pos2 < LEN(@InputValue)
)
SELECT SUBSTRING(@InputValue, MIN(Pos1)+1, MAX(Pos2)-MIN(Pos1)) AS AfterFieldNr
FROM CTE
WHERE FieldNr > 12;

Возвращает:

Test1|Test2|

Тест здесь на rextester.

Но если у вас SQL Server 2017 или более поздней версии, то вы можетеиспользуйте STRING_SPLIT и STRING_AGG.

SELECT STRING_AGG(value,'|') AS After12
FROM
(
  SELECT
   value,
   ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS rn
  FROM STRING_SPLIT(@InputValue, '|')
) AS q
WHERE rn > 12;

дБ <> скрипка здесь

0 голосов
/ 10 октября 2018

Не самый элегантный, но решающий для заданных требований:

DECLARE @InputValue AS VARCHAR(200) = '100231|ABC Limited||Liquidated|514321||AU||Testwood|5165|5/14/1996 12:00:00 AM|8/1/2003 12:00:00 AM|Test1|Test2|'

SELECT
SUBSTRING(@InputValue,
    CHARINDEX('|',@InputValue,
        CHARINDEX('|',@InputValue,
            CHARINDEX('|',@InputValue,
                CHARINDEX('|',@InputValue,
                    CHARINDEX('|',@InputValue,
                        CHARINDEX('|',@InputValue,
                            CHARINDEX('|',@InputValue,
                                CHARINDEX('|',@InputValue,
                                    CHARINDEX('|',@InputValue,
                                        CHARINDEX('|',@InputValue,
                                            CHARINDEX('|',@InputValue,
                                                CHARINDEX('|',@InputValue) + 1
                                            ) + 1
                                        ) + 1
                                    ) + 1
                                ) + 1
                            ) + 1
                        ) + 1 
                    ) + 1
                ) + 1
            ) + 1
        ) + 1
    )
,LEN(@InputValue))

Предполагая, что вы знаете, всегда будет 14 '|'для каждой строки вы можете использовать более сокращенную версию, такую ​​как:

DECLARE @InputValue AS VARCHAR(200) = '100231|ABC Limited||Liquidated|514321||AU||Testwood|5165|5/14/1996 12:00:00 AM|8/1/2003 12:00:00 AM|Test1|Test2|'

SELECT
RIGHT(@InputValue,
    CHARINDEX('|',REVERSE(@InputValue),
        CHARINDEX('|',REVERSE(@InputValue),
            CHARINDEX('|',REVERSE(@InputValue)) + 1
        ) + 1
    )
)
...