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