Извлечь определенную строку из столбца типа nvarchar на SQL Server - PullRequest
1 голос
/ 14 апреля 2020

У меня есть строка типа &hprop=anprop_p&asofmonth=01/2017&OutputType=PDF&IsGrid=-&ReportCode=AllCol1&Attach=NO&IsRequestQue=true, и я хочу получить значения, разделенные символом & из строки.

Как мы видим выше, каждая строка отделяется символом &, и оба значения имеют имя, т.е. Outputtype= и ReportCode=

В запросе SQL он должен возвращать только значения в разных столбцах. AllCol1 A и PDF

Я пробовал приведенный ниже запрос, но он получает строку ReportCode = AllCol1

declare @Str varchar(500)
select  SUBSTRING(SUBSTRING(@Str, CHARINDEX('&ReportCode=', @Str) + 1, LEN(@Str)), 0, CHARINDEX('&', SUBSTRING(@Str, CHARINDEX('&', @Str) +1, LEN(@Str))))

Ответы [ 2 ]

2 голосов
/ 14 апреля 2020

Поскольку вы используете SQL Server 2016, вы можете воспользоваться STRING_SPLIT(), чтобы разделить ваш URL-адрес на параметры запроса компонента, например,

SELECT  *
FROM    STRING_SPLIT(N'&hprop=anprop_p&asofmonth=01/2017&OutputType=PDF&IsGrid=-&ReportCode=AllCol1&Attach=NO&IsRequestQue=true', '&');

Вернет:

value
-----------------

hprop=anprop_p
asofmonth=01/2017
OutputType=PDF
IsGrid=-
ReportCode=AllCol1
Attach=NO
IsRequestQue=true

Затем вам нужно будет разделить каждый результат на =, чтобы разделить его на имя параметра и аргумент. например,

SELECT  s.value,
        Parameter = CASE WHEN CHARINDEX('=', s.value) = 0 THEN s.value ELSE LEFT(s.value, CHARINDEX('=', s.value) - 1) END,
        Value = CASE WHEN CHARINDEX('=', s.value) = 0 THEN NULL ELSE SUBSTRING(s.value, CHARINDEX('=', s.value) + 1, LEN(s.value)) END
FROM    STRING_SPLIT(N'&hprop=anprop_p&asofmonth=01/2017&OutputType=PDF&IsGrid=-&ReportCode=AllCol1&Attach=NO&IsRequestQue=true', '&') s;

Возвращает:

value               Parameter       Value
-------------------------------------------------
                    NULL
hprop=anprop_p      hprop           anprop_p
asofmonth=01/2017   asofmonth       01/2017
OutputType=PDF      OutputType      PDF
IsGrid=-            IsGrid          -
ReportCode=AllCol1  ReportCode      AllCol1
Attach=NO           Attach          NO
IsRequestQue=true   IsRequestQue    true

Наконец, вам просто нужно извлечь термины, которые вам действительно интересны, и PIVOT их, чтобы вернуть одну строку. Собрав все воедино, вы получите:

DECLARE @T TABLE (ID INT IDENTITY, Col NVARCHAR(MAX));
INSERT @T (Col) 
VALUES 
    (N'&hprop=anprop_p&asofmonth=01/2017&OutputType=PDF&IsGrid=-&ReportCode=AllCol1&Attach=NO&IsRequestQue=true'),
    (N'&hprop=anprop_p&asofmonth=01/2017&OutputType=XLS&IsGrid=-&ReportCode=AllCol3&Attach=NO&IsRequestQue=false');

SELECT  pvt.ID, pvt.OutputType, pvt.ReportCode
FROM    (   SELECT  T.ID,
                    t.Col,
                    Parameter = CASE WHEN CHARINDEX('=', s.value) = 0 THEN s.value ELSE LEFT(s.value, CHARINDEX('=', s.value) - 1) END,
                    Value = CASE WHEN CHARINDEX('=', s.value) = 0 THEN NULL ELSE SUBSTRING(s.value, CHARINDEX('=', s.value) + 1, LEN(s.value)) END
            FROM    @T AS t
                    CROSS APPLY STRING_SPLIT(T.Col, '&') AS s
            WHERE   s.value <> ''
        ) AS t
        PIVOT (MAX(Value) FOR Parameter IN ([ReportCode], [OutputType])) AS pvt;

Что возвращает:

ID  OutputType  ReportCode
----------------------------------
1   PDF         AllCol1
2   XLS         AllCol3

Пример на БД <> Fiddle

0 голосов
/ 14 апреля 2020

Использование string_split():

select max(case when s.value like 'Outputtype=%'
                then stuff(s.value, 1, 11, '')
           end) as Outputtype,
       max(case when s.value like 'ReportCode=%'
                then stuff(s.value, 1, 11, '')
           end) as ReportCode       
from string_split(@str, '&') s;

Здесь - это дБ <> скрипка.

...