[SQL] JSON에 SQL - SQL 2016의 값의 배열로 객체의 배열
SQLJSON에 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.감사! 우리가 발견 한이 솔루션은 처음 XML로 변환하는 것입니다 -
감사! 우리가 발견 한이 솔루션은 처음 XML로 변환하는 것입니다 -
SELECT JSON_QUERY('[' + STUFF(( SELECT ',' + '"' + item_id + '"' FROM #temp FOR XML PATH('')),1,1,'') + ']' ) ids FOR JSON PATH , WITHOUT_ARRAY_WRAPPER
-
==============================
2.남자 이름!
남자 이름!
나는이 그것을하는 더 간단한 방법이라고 생각 :
SELECT '"ids": ' + REPLACE( REPLACE( (SELECT item_id FROM #temp FOR JSON AUTO),'{"item_id":','' ), '"}','"' )
-
==============================
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.원시 값의 배열이 유효 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.이러한 솔루션의 대부분은 본질적으로 배열의 내용을 나타내는 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
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
'SQL' 카테고리의 다른 글
[SQL] COUNT별로 필터 (*)? (0) | 2020.04.07 |
---|---|
[SQL] 행으로 분할 열 데이터에 대한 SQL 쿼리 (0) | 2020.04.07 |
[SQL] IN 절에서 모든 값을 일치 (0) | 2020.04.07 |
[SQL] 하위 쿼리는 IN 대 EXISTS - MySQL의 (0) | 2020.04.07 |
[SQL] SQL 쿼리는 이전에 알려진 값의 값으로 행에 NULL 값을 대체 (0) | 2020.04.07 |