SQL-запрос для поиска определенной части строки в столбце - PullRequest
2 голосов
/ 06 ноября 2019

Я хочу найти определенную часть текстовой строки nvarchar в столбце.

Текстовая строка структурирована так: X#2016-06-17#7483631#2016-06-27#2#167890##920, она разделена на #. Я хочу найти 6-й текстовый блок, 167890 в этом случае.

Есть ли простой способ сделать это?

Ответы [ 2 ]

6 голосов
/ 06 ноября 2019

Возможно с небольшим XML

Пример

Declare @YourTable table (SomeCol varchar(500))
Insert Into @YourTable values
('X#2016-06-17#7483631#2016-06-27#2#167890##920')

Select SomeCol
      ,Pos6 = cast('<x>' + replace(A.SomeCol,'#','</x><x>')+'</x>' as xml).value('/x[6]','varchar(50)')
 From  @YourTable A

Возвращает

SomeCol                                         Pos6
X#2016-06-17#7483631#2016-06-27#2#167890##920   167890
0 голосов
/ 06 ноября 2019

Создайте функцию SPLIT, возвращая каждую часть с индексом, как показано ниже:

 CREATE FUNCTION [dbo].[StringSplit_WithIndex] (@str_in VARCHAR(8000),@separator VARCHAR(4) ) RETURNS @strtable TABLE (strval VARCHAR(8000),rn INT IDENTITY(1,1)) AS
 BEGIN
    DECLARE
    @Occurrences INT,
    @Counter INT,
    @tmpStr VARCHAR(8000)

    SET @Counter = 0
    IF SUBSTRING(@str_in,LEN(@str_in),1) <> @separator
        SET @str_in = @str_in + @separator
    SET @Occurrences = (DATALENGTH(REPLACE(@str_in,@separator,@separator+'#')) - DATALENGTH(@str_in))/ DATALENGTH(@separator)
    SET @tmpStr = @str_in
    WHILE @Counter <= @Occurrences
    BEGIN
        SET @Counter = @Counter + 1
        INSERT INTO @strtable
        VALUES ( SUBSTRING(@tmpStr,1,CHARINDEX(@separator,@tmpStr)-1))
        SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@separator,@tmpStr)+1,8000)
        IF DATALENGTH(@tmpStr) = 0
        BREAK
    END

    RETURN
 END

Затем все, что вам нужно, чтобы использовать поле "rn" после разделения, как:

 DECLARE @s VARCHAR(255) = 'X#2016-06-17#7483631#2016-06-27#2#167890##920'
 SELECT * 
 FROM [StringSplit_WithIndex](@s,'#') 
 WHERE rn=6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...