TSQL-从较大的字符串中解析出子字符串

时间:2019-02-27 18:56:33

标签: tsql sql-server-2016

我有一堆行,其值如下所示。不幸的是,它是我必须解析和加载的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

有人可以帮我吗?

谢谢,谢谢!

3 个答案:

答案 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,将从指定路径中提取一个值。