我从客户端收到了一个有效的JSON字符串,它包含一个整数值数组:
declare @JSON nvarchar(max) = N'{"Comments": "test", "Markets": [3, 151]}'
如何正确选择市场ID?
如果我使用这样的查询:select * from openjson(@JSON) j
,则返回
市场的类型是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)
答案 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>
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
INT
并过滤我们的UPDATE,就像我们处理任何其他子查询一样。