programing

SQL Server 2016에서 json 어레이 길이를 가져옵니다.

newstyles 2023. 3. 25. 10:56

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