【问题标题】:How can I select a dynamic number of substrings at dynamically determined locations in a string?如何在字符串中动态确定的位置选择动态数量的子字符串?
【发布时间】:2014-11-12 19:00:58
【问题描述】:

我的数据库中有一串信息,它是一串 json,我正试图从中获取一些特定的信息。下面是一个 json 示例,我试图从每个条目中获取 SuIDQuantity。有时只有一个条目,有时有两个以上,但它们总是这样格式化。

我尝试过使用charindexleftrightsubstringreplace 的组合,但是当有多个时我不知道如何让它工作我需要的碎片。

[{
    "SuID": 8348,
    "SuParentSuID": 652,
    "Quantity": 0,
    "LeadTime": 72,
    "LeadTimeClosures": 0,
    "Transships": 0,
    "InventoryStatus": 2,
    "HasCurrentFeed": 1,
    "LeadTimeSource": 0,
    "GhcPrgBitwise": 0,
    "QuantityAdjustment": 0,
    "ExclusionCriteria": 0
}, {
    "SuID": 8349,
    "SuParentSuID": 652,
    "Quantity": 454,
    "LeadTime": 72,
    "LeadTimeClosures": 0,
    "Transships": 0,
    "InventoryStatus": 1,
    "HasCurrentFeed": 1,
    "LeadTimeSource": 1,
    "GhcPrgBitwise": 0,
    "QuantityAdjustment": 0,
    "ExclusionCriteria": 0
}]

我需要得到这样的表:

 Suid | Quantity
------|----------
 8348 |     0
 8349 |    454

【问题讨论】:

  • 这是 PostgreSQL 还是 SQL-Server?你的标签没有意​​义。
  • 这是最容易找到解决方案的人。我可以同时使用任何一种,但不知道如何开始。

标签: sql postgresql tsql substring


【解决方案1】:

使用 Postgres,您可以使用实际的 json 数据类型来使这个非常简单

SELECT j->>'Suid' AS suid
     , j->>'Quantity' AS quantity
FROM   json_array_elements(my_json) j

my_jsonjson 类型的 JSON 值。
文字输入也很简单:

SELECT j->>'Suid' AS suid
     , j->>'Quantity' AS quantity
FROM   json_array_elements( '[{
       "SuID": 8348,
       "Quantity": 0,
       ...
   }, {
       "SuID": 8349,
       "Quantity": 454,
       ...
   }]'::json) j

JSON Functions and operators in the manual.

【讨论】:

    【解决方案2】:

    您可以通过将字符串在{} 之间拆分,然后再次拆分这些部分来实现您的需要。

    以下是 SqlServer 的示例:

    declare @str varchar(1000)
    set @str = '[{ .... }]' -- string of JSON
    
    select
        Suid = sb2.Value,
        Quantity = sb3.Value
    from ftStringBetween(@str, '{', '}') sb
        outer apply ftStringBetween(sb.Value, '"SuID": ', ',') sb2
        outer apply ftStringBetween(sb.Value, '"Quantity": ', ',') sb3
    

    输出是:

    Suid    Quantity
    ------- ---------
    8348    0
    8349    454
    

    其中ftStringBetween是字符串拆分函数:

    create function ftStringBetween
    (
        @str varchar(1000),
        @tagStart varchar(50),
        @tagEnd varchar(50)
    )
    returns table as
    return
        with [10](N) as (select 1 union all select 1 union all select 1 union all select 1 union all select 1
            union all select 1 union all select 1 union all select 1 union all select 1 union all select 1),
        [1k](N) as (select 1 from [10] a cross join [10] b cross join [10] c),
        v3(N) as (select top (isnull(datalength(@str), 0)) row_number() over (order by @@spid) from [1k]),
        v4(N) as (select N + datalength(@tagStart) from v3 where charindex(@tagStart, @str, N) = N),
        v5(N1, N2) as (select N, N2=isnull(nullif(charindex(@tagEnd, @str, N), 0), datalength(@str) + 1) from v4)
        select Value = substring(@str, N1, N2-N1)
        from v5
    

    我希望您可以根据自己的需要进行调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-01
      • 2021-05-30
      • 2023-03-21
      • 2016-03-14
      • 1970-01-01
      相关资源
      最近更新 更多