我有一个 SQL 列,其中有一个单一的 JSON 数组:
{"names":["Joe","Fred","Sue"]}
给定一个搜索字符串,我如何使用SQL在名字数组中搜索匹配项?我正在使用SQL 2016,并已查看JSON_QUERY,但不知道如何在JSON数组上搜索匹配项。像以下这样的东西会很好。
SELECT *
FROM table
WHERE JSON_QUERY(column, '$.names') = 'Joe'
我有一个 SQL 列,其中有一个单一的 JSON 数组:
{"names":["Joe","Fred","Sue"]}
给定一个搜索字符串,我如何使用SQL在名字数组中搜索匹配项?我正在使用SQL 2016,并已查看JSON_QUERY,但不知道如何在JSON数组上搜索匹配项。像以下这样的东西会很好。
SELECT *
FROM table
WHERE JSON_QUERY(column, '$.names') = 'Joe'
要在JSON数组中进行搜索,需要使用OPENJSON
DECLARE @table TABLE (Col NVARCHAR(MAX))
INSERT INTO @table VALUES ('{"names":["Joe","Fred","Sue"]}')
SELECT * FROM @table
WHERE 'Joe' IN ( SELECT value FROM OPENJSON(Col,'$.names'))
或者作为另一种选择,可以使用CROSS APPLY
。
SELECT * FROM
@table
CROSS APPLY OPENJSON(Col,'$.names')
WHERE value ='Joe'
当您知道包含数据的关键字时:
SELECT column_name from table_name where column_name->>'key' LIKE '%QUERYSTRING%';
当您不知道包含数据的关键字时:
SELECT column_name from table_name where column_name::text LIKE '%QUERYSTRING%';
SELECT JSON_EXTRACT(COLUMN, "$.names") AS NAME
FROM TABLE JSON_EXTRACT(COLUMN, "$.names") != ""
将TABLE替换为您的表名,将COLUMN替换为表中的列名。 我提到的关键字名称是根据您的问题而命名的。
仅想补充现有答案的一个简单解决方案,即如何检查 JSON 中的数组是否包含某个值:
DECLARE @Json NVARCHAR(max) = '{"names":["Joe","Fred","Sue"]}'
IF EXISTS (SELECT value FROM OPENJSON(@Json,'$.names') WHERE value = 'Joe')
PRINT 'Array contains "Joe"'
ELSE
PRINT 'Array does not contain "Joe"'
这非常简单,可以使用JSON_CONTAINS()函数轻松完成。
SELECT * FROM table
where JSON_CONTAINS(column, 'joe','$.name');