我有一堆行,其值如下所示。不幸的是,它是我必须解析和加载的json提取。无论如何,由于某种原因,我的json解析工具不想将完整的列解析出来,因此我需要在TSQL中进行。我只需要unique_id字段:
[{"unique_id":"12345","system_type":"Test System."}]
我尝试了下面的SQL,但是它只返回整列的前5个字符。我知道问题出在哪里,我需要知道如何告诉子字符串继续到值后面的第四组引号为止。我不确定如何对子字符串进行这样的编码。
select substring([jsonfield],CHARINDEX('[{"unique_id":"',[jsonfield]),
CHARINDEX('"',[jsonfield]) - CHARINDEX('[{"unique_id":"',[jsonfield]) +
LEN('"')) from etl.my_test_table
有人可以帮我吗?
谢谢,谢谢!
答案 0 :(得分:2)
自从您标记了2016年以来,为什么不使用OPENJSON()
这是一个例子:
DECLARE @TestData TABLE
(
[SampleData] NVARCHAR(MAX)
);
INSERT INTO @TestData (
[SampleData]
)
VALUES ( N'[{"unique_id":"12345","system_type":"Test System."}]' )
,( N'[{"unique_id":"1234567","system_type":"Test System."},{"unique_id":"1234567_2","system_type":"Test System."}]' )
SELECT b.[unique_id]
FROM @TestData [a]
CROSS APPLY
OPENJSON([a].[SampleData], '$')
WITH (
[unique_id] NVARCHAR(100) '$.unique_id'
) AS [b];
给你
unique_id
---------------
12345
1234567
1234567_2
您也可以获取所有字段,只需将它们添加到WITH子句中即可:
SELECT [b].[unique_id]
, [b].[system_type]
FROM @TestData [a]
CROSS APPLY
OPENJSON([a].[SampleData], '$')
WITH (
[unique_id] NVARCHAR(100) '$.unique_id'
, [system_type] NVARCHAR(100) '$.system_type'
) AS [b];
答案 1 :(得分:0)
逐步进行
首先将所有内容保留在system_type的左侧
SELECT LEFT(jsonfield, CHARINDEX('","system_type":"',jsonfield) as s
FROM -- etc
然后将所有内容带到"unique_id":"
SELECT RIGHT(S, LEN(S) - (CHARINDEX('"unique_id":"',S) + 12)) as Result
FROM (
SELECT LEFT(jsonfield, CHARINDEX('","system_type":"',jsonfield) as s
FROM -- etc
) X
请注意,我没有对此进行测试,因此可能会出现一个错误或语法错误,但是您明白了。
答案 2 :(得分:0)
如果您的大字符串仅是发布的简单JSON,则解决方案非常简单:
SELECT
JSON_VALUE(N'[{"unique_id":"12345","system_type":"Test System."}]','$[0].unique_id');
JSON_VALUE()
needs SQL-Server 2016,将从指定路径中提取一个值。