SQL Server 2016 - 如何从JSON中选择整数数组

Fis*_*NaN 2 t-sql sql-server json

我从客户端收到了一个有效的JSON字符串,它包含一个整数值数组:

declare @JSON nvarchar(max) = N'{"Comments": "test", "Markets": [3, 151]}'
Run Code Online (Sandbox Code Playgroud)

如何正确选择市场ID?

如果我使用这样的查询:select * from openjson(@JSON) j它会返回

在此输入图像描述

Markets的类型是4,这意味着一个对象,
但下面的查询返回null值:
select j.Markets from openjson(@JSON) with(Markets nvarchar(max)) j

我的目标是Market根据这些ID 更新表格,例如:
update Market set Active = 1 where MarketID in (3, 151)

有没有办法做到这一点?
可以使用与SQL Server 2016兼容的任何内置函数.


注意:
感谢@johnlbevan
SELECT VALUE FROM OPENJSON(@JSON, '$.Markets')完美地解决了这个问题.

为了完整性,这里是我如何"Markets": [3, 151]从SQL服务器创建JSON整数数组().
由于array_agg2016年没有开箱即用功能,我这样做了:

SELECT (
  JSON_QUERY('[' + STUFF(( SELECT ',' + CAST(MarketID AS VARCHAR)
  FROM Market
  FOR XML PATH('')),1,1,'') + ']' ) AS Markets)  
Run Code Online (Sandbox Code Playgroud)

Joh*_*van 9

要将Markets阵列与其他列一起扩展,您可以执行以下操作:

SELECT Comments, Market
FROM OPENJSON('{"Comments": "test", "Markets": [3, 151]}')
WITH (Comments nvarchar(32), Markets NVARCHAR(MAX) AS JSON) AS a
CROSS APPLY OPENJSON (a.Markets) WITH (Market INT '$') AS b
Run Code Online (Sandbox Code Playgroud)
  • 将字符串转换为json
  • 将返回的第一个字段映射到Comments具有类型的列nvarchar(32)
  • 第二个字段映射到Markets同类型的列nvarchar(max),然后用as json说的内容是JSON(见https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql#arguments为更详细的描述 - 搜索页面as json;关键段落从第4次出现开始)
  • 使用a cross apply将OPENJSON函数应用于Markets列,以便我们可以从该属性中获取值.
  • 最后使用该WITH语句将名称映射Market到返回的值,并为其指定数据类型INT.

但是,要获取执行更新所需的值列表,您可以执行以下操作:

UPDATE Market
SET Active = 1
WHERE MarketID IN
(
    SELECT value
    FROM OPENJSON('{"Comments": "test", "Markets": [3, 151]}','$.Markets')
);
Run Code Online (Sandbox Code Playgroud)

  • 哇,我知道发生了什么.我错过了"AS JSON"部分,所以我从`Markets`得到了`null`.谢谢 (2认同)