【问题标题】:TSQL - Parsing substring out of larger stringTSQL - 从较大的字符串中解析子字符串
【发布时间】:2019-02-27 18:56:33
【问题描述】:

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

谁能帮我解决这个问题?

谢谢你,我很感激!

【问题讨论】:

  • " 无论如何,我的 json 解析工具由于某种原因不想解析这个完整的列" 在寻找 TSQL 解决方法之前,您是否尝试过发布关于此的问题?

标签: tsql sql-server-2016


【解决方案1】:

既然你标记了 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];

【讨论】:

    【解决方案2】:

    一步一步来

    首先获取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
    

    注意,我没有对此进行测试,因此它可能会被关闭或出现语法错误,但你明白了。

    【讨论】:

    • @Shnugo -- 当然,如果有人根据主题进行搜索,那么我的回答可能会有所帮助,所以我不会删除它。
    【解决方案3】:

    如果您的较大的字符串只是一个简单的 JSON,那么解决方法很简单:

    SELECT 
    JSON_VALUE(N'[{"unique_id":"12345","system_type":"Test System."}]','$[0].unique_id');
    

    JSON_VALUE() needs SQL-Server 2016 将从指定路径中提取一个值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-19
      • 2019-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多