Как получить точное число из строки в SQL Server? - PullRequest
0 голосов
/ 08 мая 2019

Как получить номера заказа (189 190) из следующего поля TrigParams в базе данных SQL Server 2014.

TrigParams

{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}
{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Из других ответов видно, что SQL-Server 2016+ с широкой поддержкой JSON был бы очень полезен.Но без тебя не потерялись.Вы можете использовать строковые методы:

кредиты для Panagiotis Kanavos для MCVE

declare @table table (trigparams nvarchar(2000))

insert into @table 
values
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')

- это запрос

select LEFT(CutOff,CHARINDEX('"',CutOff)-1)
from @table t
CROSS APPLY(SELECT STUFF(t.trigparams,1,CHARINDEX('"value":"',t.trigparams)+8,'')) A(CutOff);

Идея вкратце:

В APPLY мы будем использовать STUFF() для записи ничего поверх первых символов до числа, которое вы ищете (после первого вхождения "value":". Это возвращается как столбец CutOff . Теперь мы можем использовать LEFT(), чтобы выбрать только номер.

0 голосов
/ 08 мая 2019

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

Я просто предположим, этоSQL Server 2016, который поддерживает JSON, а текст состоит из двух отдельных строк.Я также предположу , что запрос должен возвращать данные только как одно значение.

В этом случае простой вызов JSON_VALUE('$.OWLSObjKey.value') вернет данные. JSON_VALUE возвращает единственное значение из правильно сформированной строки JSON:

declare @table table (trigparams nvarchar(2000))

insert into @table 
values
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')

select JSON_VALUE(trigparams,'$.OWLSObjKey.value') As SomeKey
from @table

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

SomeKey 
189 
190 
0 голосов
/ 08 мая 2019

Предполагая, вы используете SQL Server 2016+, используйте OPENJSON:

SELECT O.OrderNumber
FROM (VALUES('{"OWLSObjKey":{"key":"OWLSObjKey","value":"189","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"189","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}'),
            ('{"OWLSObjKey":{"key":"OWLSObjKey","value":"190","type":null},"OWLSObjType":{"key":"OWLSObjType","value":"17","type":null},"ObjKey":{"key":"ObjKey","value":"190","type":null},"ObjType":{"key":"ObjType","value":"17","type":null}}')) V(TrigParams)
     CROSS APPLY OPENJSON(V.TrigParams) WITH (OWLSObjKey nvarchar(MAX) AS JSON) OK
     CROSS APPLY OPENJSON(OK.OWLSObjKey) WITH (OrderNumber int '$.value') O;

Если нет, то SQL Server не является вашим другом дляэто без использования функции CLR.Если вы не можете использовать CLR, я бы предложил использовать другой инструмент для считывания значения JSON.

...