SQL Server 2016에서 json 어레이 길이를 가져옵니다.
SQL Server 2016의 새로운 JSON_ 지원에 대해 알고 계시기 때문에 이 데이터가 연속해서 있다고 가정해 보겠습니다.
{
"BaseBoarding": 1,
"PriceLineStrategy": "PerPersonPerNight",
"Currency": "EUR",
"BasePriceLineList": [
{
"RoomTypeId": 1,
"PeriodId": 1,
"Price": 10.0
},
{
"RoomTypeId": 1,
"PeriodId": 2,
"Price": 100.0
},
{
"RoomTypeId": 1,
"PeriodId": 3,
"Price": 190.0
},
{
"RoomTypeId": 2,
"PeriodId": 1,
"Price": 280.0
},
{
"RoomTypeId": 2,
"PeriodId": 2,
"Price": 310.0
},
{
"RoomTypeId": 2,
"PeriodId": 3,
"Price": 340.0
}
]
}
BasePriceLineList의 항목 수를 가장 뛰어난 성능으로 얻으려면 어떻게 해야 합니까?(가능하면 내장된 JSON 지원을 사용하는 것이 좋습니다.
다음과 같은 내용을 작성해야 합니다.
SELECT JSON_ARRLEN(JsonDataCol, '$.BasePriceline') FROM MyTable
WHERE Id = 1
그 결과 6점입니다.
변수 대신 테이블 사용:
SELECT count(priceLineLists.RoomTypeId)
FROM Mytable
CROSS APPLY OPENJSON (JsonDataCol, N'$.BasePriceLineList')
WITH (
RoomTypeId int)
AS priceLineLists
가상 SQL 문:
SELECT JSON_ARRLEN(JsonDataCol, '$.BasePriceline') FROM MyTable
실제 문장으로 수행할 수 있습니다.
SELECT (SELECT COUNT(*) FROM OPENJSON(JsonDataCol, '$.BasePriceline')) FROM MyTable
데이터 세트로 변환한 다음 행을 셀 수 있습니다.
DECLARE @JSON NVARCHAR(4000) = N'{
"BaseBoarding": 1,
"PriceLineStrategy": "PerPersonPerNight",
"Currency": "EUR",
"BasePriceLineList": [
{
"RoomTypeId": 1,
"PeriodId": 1,
"Price": 10.0
},
{
"RoomTypeId": 1,
"PeriodId": 2,
"Price": 100.0
},
{
"RoomTypeId": 1,
"PeriodId": 3,
"Price": 190.0
},
{
"RoomTypeId": 2,
"PeriodId": 1,
"Price": 280.0
},
{
"RoomTypeId": 2,
"PeriodId": 2,
"Price": 310.0
},
{
"RoomTypeId": 2,
"PeriodId": 3,
"Price": 340.0
}
]
}'
select COUNT(*)
FROM OPENJSON(@json, N'$.BasePriceLineList')
WITH (RoomTypeID varchar(100) '$.RoomTypeId')
이 기본적인 요구는 애드혹 데이터 리뷰를 할 때 몇 번인가 떠올랐습니다.그래서 저는 아주 일반적인 스칼라 함수를 만들었습니다.기본 전제 조건이 거의 없기 때문에isnull
및/또는 사용json_value
검사하려는 중첩된 배열을 꺼냅니다.또, 퍼포먼스에 미치는 영향은 어느 정도인지도 모릅니다.한 번에 수십 개의 레코드에 대해서만 하면 됩니다.혹시 다른 사람이 여기 올 경우를 대비해서 좀 더 일반적인 방법을 찾고 있어요
메모: 이 경우 함수가 비활성 JSON 어레이에 오류를 발생시키는 것과 같은 몇 가지 해킹적인 "트릭"을 사용하였습니다.throw
함수 내부에서는 허용되지 않습니다.0에 의한 추가 분할은 암묵적 변환 설정이 매우 느슨하고 문자열 반환이 유효한 다른 장소에서 사용하는 패턴일 경우입니다.
create function array_length (@array nvarchar(max))
returns int as begin
if (@array is null or isjson(@array) != 1
or left(@array, 1) + right(@array, 1) <> '[]')
return 'Invalid JSON array provided to array_length' + (1/0)
return (select count(*) from openjson(@array))
end
많은 것을 파헤쳤고 결론은 이것을 사용하는 것이다.검색된 요소를 조회된 대로 표시하려면 개수를 제거합니다.SQL Server 2019 사용
SELECT
COUNT(JSON_QUERY(JsonObject, '$.[0].Region')) AS RegionCount
FROM YourTable
언급URL : https://stackoverflow.com/questions/43141892/get-length-of-json-array-in-sql-server-2016
'programing' 카테고리의 다른 글
Angularjs - 인수를 디렉티브로 전달합니다. (0) | 2023.03.25 |
---|---|
서로 다른 메이븐 모듈의 구성 요소 스캔/JSpring Boot 어플리케이션의 AR (0) | 2023.03.25 |
새로 고치지 않고 페이지의 데이터 업데이트 (0) | 2023.03.25 |
AngularJS - 지시사항을 지정하는 요소를 동적으로 작성합니다. (0) | 2023.03.25 |
JSON Postgres 데이터 유형 열에서 특정 문자열을 검색하려면 어떻게 해야 합니까? (0) | 2023.03.25 |