获取SQL Server 2016中的json数组的长度

时间:2017-03-31 13:25:06

标签: json sql-server-2016

您知道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作为结果。

5 个答案:

答案 0 :(得分:7)

使用表而不是变量:

SELECT count(priceLineLists.RoomTypeId)
FROM Mytable
CROSS APPLY OPENJSON (JsonDataCol, N'$.BasePriceLineList')
  WITH (
    RoomTypeId int)
      AS priceLineLists

答案 1 :(得分:6)

您可以将其转换为数据集,然后计算行数:

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')

答案 2 :(得分:4)

在进行一些临时数据审查时,我已经多次提出这个基本需求。所以我继续创建了一个很小的标量函数来完成这个非常普遍的工作。内置的假设很少,您可能需要使用isnull和/或使用json_value来提取您要检查的嵌套数组。另外,我真的不知道这会对任何规模的性能产生什么影响,我一次只需要在几十条记录中做到这一点。只是想我分享以防其他人在这里寻找一种相当通用的方式来做这件事。

注意:使用了几个hacky"技巧"在这方面确保函数在无效的JSON数组上抛出错误,即使函数内不允许throw。额外除以零是因为任何人都有非常宽松的隐式转换设置,而只是我在其他字符串返回有效的地方使用的模式。

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

答案 3 :(得分:4)

假设的 SQL 语句:

SELECT JSON_ARRLEN(JsonDataCol, '$.BasePriceline') FROM MyTable

可以通过实际语句来完成:

SELECT (SELECT COUNT(*) FROM OPENJSON(JsonDataCol, '$.BasePriceline')) FROM MyTable

答案 4 :(得分:0)

大量挖掘,我的结论是使用它。如果您想查看找到的查询元素,请删除计数。使用 SQL Server 2019

SELECT 
COUNT(JSON_QUERY(JsonObject, '$.[0].Region')) AS RegionCount
FROM YourTable