Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql,其中值位于json数组中(任何索引)_Sql_Sql Server_Tsql - Fatal编程技术网

Tsql,其中值位于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' 它正在工作,但我不知道

在MS SQL server中,我有以下JSON:

[{      "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'
)