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_agg
2016年没有开箱即用功能,我这样做了:
SELECT (
JSON_QUERY('[' + STUFF(( SELECT ',' + CAST(MarketID AS VARCHAR)
FROM Market
FOR XML PATH('')),1,1,'') + ']' ) AS Markets)
Run Code Online (Sandbox Code Playgroud)
要将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)
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次出现开始)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)
value
s并过滤我们的UPDATE,就像我们处理任何其他子查询一样. 归档时间: |
|
查看次数: |
2226 次 |
最近记录: |