Извлекать данные после и до '_' в SQL Server - PullRequest
0 голосов
/ 31 октября 2019

Я получил следующую запись в моей базе данных:

I_ABC_2000.txt  

Я хочу обрезать запись, чтобы получить: ABC

Итак, я хочу все после первого _ и до 2-го _.

Как я могу это сделать?

1 Ответ

0 голосов
/ 31 октября 2019

Возможно, есть лучшие способы сделать это ... но я использую скалярную функцию. Создайте скалярную функцию и затем вызовите эту функцию для вашей строки

CREATE FUNCTION [dbo].[fnParseString]
(
    @Section SMALLINT,
    @Delimiter CHAR,
    @Text varchar(1000)
)
RETURNS VARCHAR(8000)
AS

BEGIN
    DECLARE @NextPos SMALLINT,
        @LastPos SMALLINT,
        @Found SMALLINT

    IF @Section > 0
        SELECT  @Text = REVERSE(@Text)

    SELECT  @NextPos = CHARINDEX(@Delimiter, @Text, 1),
        @LastPos = 0,
        @Found = 1

    WHILE @NextPos > 0 AND ABS(@Section) <> @Found
        SELECT  @LastPos = @NextPos,
            @NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
            @Found = @Found + 1

    RETURN  CASE
            WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
            WHEN @Section > 0 THEN REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
            ELSE SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
        END
END

Затем вы можете вызвать функцию для вашего текста (первый аргумент - это позиция нужного вам текста, второй - разделитель вашеготекст, а жажда - фактический текст)

select dbo.[fnParseString] (1,'_','abra_ka_dabra')

вернет

Дабра

выберите dbo. [fnParseString] (2, '_',' abra_ka_dabra ')

вернется

ка

и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...