Tsql,其中值位于json数组中(任何索引)
在MS SQL server中,我有以下JSON:Tsql,其中值位于json数组中(任何索引),sql,sql-server,tsql,Sql,Sql Server,Tsql,在MS SQL server中,我有以下JSON: [{ "name": "John", "skills": ["SQL", "C#", "Azure"] }, { "name": "Jane", "surname": "Doe" }] 存储在表的字段中。我想做的是检查Name=John,无论级别如何。 如果我使用如下查询: WHERE JSON_VALUE(ColumnName, '$[0].name') = 'John' 它正在工作,但我不知道
[{ "name": "John", "skills": ["SQL", "C#", "Azure"] }, { "name": "Jane", "surname": "Doe" }]
存储在表的字段中。我想做的是检查Name=John,无论级别如何。
如果我使用如下查询:
WHERE JSON_VALUE(ColumnName, '$[0].name') = 'John'
它正在工作,但我不知道John是否在索引0上,它可能在索引1上,所以我想为任何职位创建它。基本上,我想要完成的是返回值,不管索引是什么,如果John存在于某个地方-这没关系
我试过:
WHERE JSON_VALUE(ColumnName, '$.name') = 'John'
或
但显然这不是正确的方法。
OPENJSON
和with
子句是分解JSON的好方法(如果有时可能过于复杂)
请注意,如果同一行包含多个John
,则有必要使用的整个子查询来防止查询多次返回同一行。如果确实要多次使用该行,请使用交叉应用
WHERE JSON_VALUE(ColumnName, '$[].name') = 'John'
DECLARE @t TABLE(j NVARCHAR(MAX));
INSERT @T(j) VALUES (N'[{ "name": "John", "skills": ["SQL", "C#", "Azure"] }, { "name": "Jane", "surname": "Doe" }]')
SELECT * FROM @t WHERE EXISTS (
SELECT 1
FROM OPENJSON(j)
WITH (
[name] NVARCHAR(100)
)
WHERE [name] = 'John'
)