2014-11-12 1 views
1

나는 json 문자열 인 내 데이터베이스에 일련의 정보를 가지고 있는데, 거기에서 몇 가지 특정 정보를 얻으려고합니다. json의 예가 아래에 있으며 각 항목에서 SuIDQuantity을 얻으려고합니다. 두 개 이상의 항목이있을 때만 한 항목과 시간이있는 경우가 있지만 항상 이렇게 형식화됩니다.문자열에서 동적으로 결정된 위치에서 동적으로 하위 문자열을 선택할 수 있습니까?

나는 charindex, left는, right, substringreplace,하지만 나는 그것이 내가 필요로하는 여러 가지가있을 때 작동하도록하는 방법을 알아낼 수 없습니다의 조합을 사용하려고했습니다.

[{ 
    "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 
+1

이 PostgreSQL을 또는 SQL-서버인가? 귀하의 태그가 의미가 없습니다. –

+0

누군가가 해결책을 찾는 것이 가장 쉽습니다. 나는 나의 끝에서 어느 쪽이든으로 일할 수있다. 그러나 그것을 시작하는 방법을 이해할 수 없다. – Travis

답변

0

눈에 띄게 간단한 :

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

my_json

유형 json의 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.

0

당신은 {} 후 다시이 부분을 분할 사이 조각으로 분할 문자열이 필요 얻을 수 있습니다.

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 

아래

는 SQLSERVER에 대한 샘플입니다 . 당신이 만드는 실제 json 데이터 유형을 사용할 수 있습니다 포스트 그레스와

관련 문제