Как разбить строку в SQL Server - PullRequest
0 голосов
/ 22 апреля 2019

Я пытаюсь отделить значение от столбца model_interested, чтобы из целых данных отображалась только модель

SELECT SUBSTRING(model_interested, 20, CHARINDEX('model', model_interested)) AS model_interested 
FROM cust

Из изображения в столбце model_interested, который я хочу отображать только

"model":"A180"
"model":"A200 AMG FL"

Я попытался разделить по количеству символов, но я не думаю, что это правильный путь.

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Вы можете использовать следующее решение, используя SUBSTRING и CHARINDEX:

SELECT SUBSTRING(model_interested, CHARINDEX('"model":"', model_interested) + LEN('"model":"'), CHARINDEX('"', model_interested, CHARINDEX('"model":"', model_interested) + LEN('"model":"')) - (CHARINDEX('"model":"', model_interested) + LEN('"model":"')))
FROM table_name

Чтобы получить все свойство (с именем и значением свойства) вы можете использовать следующее решение:

SELECT SUBSTRING(model_interested, CHARINDEX('"model":"', model_interested), CHARINDEX('"', model_interested, CHARINDEX('"model":"', model_interested) + LEN('"model":"')) - CHARINDEX('"model":"', model_interested) + 1)
FROM table_name

Вы также можете использовать JSON_VALUE, чтобы получить ожидаемое значение, но вы должны изменить данные на допустимое значение JSON:

SELECT JSON_VALUE(REPLACE(REPLACE(model_interested, '{[', '[{'), ']}', '}]'), '$[0].model')
FROM table_name

демо на dbfiddle.uk

0 голосов
/ 22 апреля 2019

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

;with cte as
(
 SELECT   
       Split.a.value('.', 'VARCHAR(100)') AS model_interested  
 FROM  (
         SELECT CAST ('<M>' + REPLACE([model_interested], '.', '</M><M>') + '</M>' AS XML)
                as  model_interested_xml
         FROM  @cust

        ) AS A CROSS APPLY model_interested_xml.nodes ('/M') AS Split(a)  
    )
select model_interested
from cte
where CHARINDEX('model',model_interested) > 0

демо здесь: https://rextester.com/CCW41495

...