복붙노트

[SQL] JSON에 SQL - SQL 2016의 값의 배열로 객체의 배열

SQL

JSON에 SQL - SQL 2016의 값의 배열로 객체의 배열

SQL 2016 JSON으로 SQL 서버에서 데이터를 변환하는 새로운 기능이 있습니다. I, 즉 값의 배열로 객체의 배열을 조합 한 어려움을 겪고

예 -

CREATE TABLE #temp (item_id VARCHAR(256))

INSERT INTO #temp VALUES ('1234'),('5678'),('7890')

SELECT * FROM #temp

--convert to JSON

SELECT (SELECT item_id 
FROM #temp
FOR JSON PATH,root('ids')) 

결과 -

{
    "ids": [{
        "item_id": "1234"
    },
    {
        "item_id": "5678"
    },
    {
        "item_id": "7890"
    }]
}

하지만이 같은 결과를 원하는 -

"ids": [
        "1234",
        "5678",
        "7890"
    ]

누군가가 도움을 나를 기쁘게 할 수 있습니까?

해결법

  1. ==============================

    1.감사! 우리가 발견 한이 솔루션은 처음 XML로 변환하는 것입니다 -

    감사! 우리가 발견 한이 솔루션은 처음 XML로 변환하는 것입니다 -

    SELECT  
    JSON_QUERY('[' + STUFF(( SELECT ',' + '"' + item_id + '"' 
    FROM #temp FOR XML PATH('')),1,1,'') + ']' ) ids  
    FOR JSON PATH , WITHOUT_ARRAY_WRAPPER 
    
  2. ==============================

    2.남자 이름!

    남자 이름!

    나는이 그것을하는 더 간단한 방법이라고 생각 :

        SELECT '"ids": ' + 
        REPLACE( 
          REPLACE( (SELECT item_id FROM #temp FOR JSON AUTO),'{"item_id":','' ),
          '"}','"' )
    
  3. ==============================

    3.

    declare @temp table (item_id VARCHAR(256))
    
    INSERT INTO @temp VALUES ('123"4'),('5678'),('7890')
    
    SELECT * FROM @temp
    
    --convert to JSON
    
    select 
        json_query(QUOTENAME(STRING_AGG('"' + STRING_ESCAPE(item_id, 'json') + '"', char(44)))) as [json]
    from @temp
    for json path
    

    우리는 JSON 배열로 CONCATENATE 문자열을 원하는 경우 :

    1) 이스케이프 문자열 - STRING_ESCAPE

    콤마 구분 2) CONCATENATE 문자열 - STRING_AGG는 콤마 ASCII 코드는 44이며

    괄호 3) 추가 견적을 - PARAM없이 QUOTENAME ()

    JSON 같은 요소의 어레이)과 4) 리턴 스트링 (- JSON_QUERY

  4. ==============================

    4.원시 값의 배열이 유효 JSON이기 때문에, 원시적 인 값의 배열을 선택하기위한 설비가 SQL 서버의 JSON 기능에 내장되지 않은 이상한 것 같다. (에 반대 이러한 기능이 존재하는 경우에, 나는 적어도 검색 꽤 후를 발견 할 수 없었다).

    원시 값의 배열이 유효 JSON이기 때문에, 원시적 인 값의 배열을 선택하기위한 설비가 SQL 서버의 JSON 기능에 내장되지 않은 이상한 것 같다. (에 반대 이러한 기능이 존재하는 경우에, 나는 적어도 검색 꽤 후를 발견 할 수 없었다).

    설명 된 접근 방식은 작품 위의 설명. 큰 쿼리의 필드에 적용 때, 프리미티브의 배열은 따옴표로 둘러싸여 있습니다.

    예를 들어,이

    DECLARE @BomTable TABLE (ChildNumber dbo.udt_ConMetPartNumber);
    INSERT INTO @BomTable (ChildNumber) VALUES (N'101026'), (N'101027');
    SELECT N'"Children": ' + REPLACE(REPLACE((SELECT ChildNumber FROM @BomTable FOR JSON PATH), N'{"ChildNumber":', N''), '"}','');
    

    생산 방식으로 작동합니다 :

    "Children": ["101026,"101027]
    

    그러나, 위의 방법에 따라,이 :

    SELECT
        p.PartNumber,
        p.Description,
        REPLACE(REPLACE((SELECT
                            ChildNumber
                         FROM
                            Part.BillOfMaterials
                         WHERE
                            ParentNumber = p.PartNumber
                         ORDER BY
                            ChildNumber
                        FOR
                         JSON AUTO
                        ), N'{"ChildNumber":', N''), '"}', '"') AS [Children]
    FROM
        Part.Parts AS p
    WHERE
        p.PartNumber = N'104444'
    FOR
        JSON PATH
    

    생성합니다 :

    [
        {
            "PartNumber": "104444",
            "Description": "ASSY HUB           R-SER  DRIV HP10  ABS",
            "Children": "[\"101026\",\"101027\",\"102291\",\"103430\",\"103705\",\"104103\"]"
        }
    ]
    

    어디 아이들의 배열은 문자열로 싸여있다.

  5. ==============================

    5.이러한 솔루션의 대부분은 본질적으로 배열의 내용을 나타내는 CSV를 생성 한 다음 최종 JSON 형식으로 그 CSV를 가하고 있습니다. 여기에 내가 피하기 XML로 무엇을 사용 :

    이러한 솔루션의 대부분은 본질적으로 배열의 내용을 나타내는 CSV를 생성 한 다음 최종 JSON 형식으로 그 CSV를 가하고 있습니다. 여기에 내가 피하기 XML로 무엇을 사용 :

    DECLARE @tmp NVARCHAR(MAX) = ''
    
    SELECT @tmp = @tmp + '"' + [item_id] + '",'
    FROM #temp -- Defined and populated in the original question
    
    SELECT [ids] = JSON_QUERY((
        SELECT CASE
            WHEN @tmp IS NULL THEN '[]'
            ELSE '[' + SUBSTRING(@tmp, 0, LEN(@tmp)) + ']'
            END
        ))
    FOR JSON PATH, WITHOUT_ARRAY_WRAPPER
    
  6. from https://stackoverflow.com/questions/37708638/sql-to-json-array-of-objects-to-array-of-values-in-sql-2016 by cc-by-sa and MIT license