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

时间:2018-03-19 23:59:12

标签: json sql-server tsql

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

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

如何正确选择市场ID?

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

enter image description here

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

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

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

注意:
感谢@johnlbevan
SELECT VALUE FROM OPENJSON(@JSON, '$.Markets')可以很好地解决这个问题。

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

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

1 个答案:

答案 0 :(得分:7)

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

<http:request-config name="HTTP-GsuiteApi-Request-Configuration" protocol="HTTPS" host="www.googleapis.com" port="443" doc:name="HTTP Request Configuration" >
         <oauth2:authorization-code-grant-type clientId="${client_id}" clientSecret="${client_secret}" redirectionUrl="https://devserverurl:8082/callback" tlsContext-ref="TLS_Context">
             <oauth2:authorization-request authorizationUrl="https://accounts.google.com/o/oauth2/auth" localAuthorizationUrl="https://devserverurl:8082/login" scopes="https://www.googleapis.com/auth/admin.directory.user"/>
             <oauth2:token-request tokenUrl="https://accounts.google.com/o/oauth2/token">
                 <oauth2:token-response accessToken="#[json:access_token]"/>
             </oauth2:token-request>
         </oauth2:authorization-code-grant-type>
 </http:request-config>
  • 将字符串转换为json
  • 将返回的第一个字段映射到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
  • 类型的Comments
  • 将第二个字段映射到类型为nvarchar(32)的{​​{1}}列,然后使用Markets表示内容为json(有关详细说明,请参阅https://docs.microsoft.com/en-us/sql/t-sql/functions/openjson-transact-sql#arguments - 搜索nvarchar(max)的页面;关键段落从第4次出现开始)
  • 使用as json将OPENJSON函数应用于Markets列,以便我们可以从该属性中获取值。
  • 最后使用as json语句将名称cross apply映射到返回的值,并为其指定数据类型WITH

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

Market