Как извлечь часть строки JSON из строки SQL Base64 - PullRequest
0 голосов
/ 15 марта 2019

Положение:

У меня есть столбец закодированных строк Base64, которые я хотел бы декодировать и извлечь из него определенную часть. Кажется, что декодированное значение имеет формат JSON (совсем не знаком с JSON)

Цель:

Как извлечь значение словарной части строки JSON.

Текущий запрос:

SELECT 
    CONVERT(VARCHAR(MAX),CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)')) AS RESULT
FROM
    (SELECT [value] AS BASE64_COLUMN FROM #test1) as testtable

Выход:

Вывод выглядит так:

RESULT
{"a":1,"b":2,"c":3,"d":4}

Желаемый выход: Как я могу извлечь значение первого словаря: 1?

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Я чувствую, что у нас нет всех частей здесь, но, используя эту строку JSON, вы можете получить значение для ключа 'a', просто используя OPENJSON:

DECLARE @JSON nvarchar(MAX) = N'{"a":1,"b":2,"c":3,"d":4}';

SELECT [value]
FROM OPENJSON(@JSON)
WHERE [key] = 'a';

Я, конечно, предполагаю, что вы используете SQL Server 2016. В противном случае SQL Server не поддерживает синтаксический анализ JSON, и вам будет лучше использовать приложение для этого.

Для 2014- если вы просто хотите получить значение первого узла, вы можете сделать

SELECT V.JSON, SUBSTRING([JSON],CHARINDEX(':',[JSON])+1,CHARINDEX(',',[JSON])-(CHARINDEX(':',[JSON])+1))
FROM (VALUES(@JSON))V([JSON]);

Итак, для слепой догадки на вашем столе (поскольку я не могу проверить):

SELECT SUBSTRING([JSONString],CHARINDEX(':',[JSONString])+1,CHARINDEX(',',[JSONString])-(CHARINDEX(':',[JSONString])+1))
FROM (SELECT [value] AS BASE64_COLUMN FROM #test1) as testtable
     CROSS APPLY (VALUES(CONVERT(VARCHAR(MAX),CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)')))V(JSONString);

Это предполагает , что каждая строка в вашем выражении содержит как как минимум 1 : символ, так и , символ. Если это не так, то нам нужны более (репрезентативные) выборочные данные.

1 голос
/ 15 марта 2019

Я не знаю, насколько постоянным / чистым является это решение (на самом деле оно довольно уродливо), и в большинстве случаев вам следует пересмотреть вопрос об использовании кодированных в json строк для этих значений или проанализировать его в приложении, как предлагает @Larnu.В любом случае вы можете использовать PATINDEX () и SUBSTRING () , чтобы получить первое значение:

SELECT
    SUBSTRING (
        CONVERT(VARCHAR(MAX),CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)')),
        6,
        PATINDEX(
            '%,"b":%',
            CONVERT(VARCHAR(MAX),CAST('' AS XML).value('xs:base64Binary(sql:column("BASE64_COLUMN"))', 'VARBINARY(MAX)'))
        ) -6
    )
FROM
    (SELECT [value] AS BASE64_COLUMN FROM #test1) as testtable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...