如何从SQL字符串Base64中提取JSON字符串的一部分

时间:2019-03-15 17:32:58

标签: sql json sql-server xml base64

情况:

我有一列经过编码的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 个答案:

答案 0 :(得分:2)

我觉得这里没有全部内容,但是,使用该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 Server2016。否则,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 :(得分:1)

我不知道此解决方案的永久性/清洁性(实际上是很丑陋的),在大多数情况下,您应该重新考虑对这些值使用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;