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

问题描述 投票:0回答:2

情况:

我有一列编码的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?

sql json sql-server xml base64
2个回答
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 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
投票

我不知道这个解决方案是多么永久/干净(实际上它非常难看),在大多数情况下,你应该重新考虑使用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;
© www.soinside.com 2019 - 2024. All rights reserved.