如何搜索包含 JSON 数组的 SQL 列
How to search SQL column containing JSON array
我有一个 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'
非常简单,使用 JSON_CONTAINS() 函数即可轻松完成。
SELECT * FROM table
where JSON_CONTAINS(column, 'joe','$.name');
Postgres 语法
当您知道保存数据的密钥时:
SELECT column_name from table_name where column_name->>'key' LIKE '%QUERYSTRING%';
当您不知道保存数据的密钥时:
SELECT column_name from table_name where column_name::text LIKE '%QUERYSTRING%';
您可以通过以下查询在 JSON 数组中搜索匹配项:
SELECT JSON_EXTRACT(COLUMN, "$.names") AS NAME
FROM TABLE JSON_EXTRACT(COLUMN, "$.names") != ""
将 TABLE 替换为您的 table 名称,将 COLUMN 替换为 table 中的列名称。
我在你的问题中提到的密钥名称。
我有一个 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'
非常简单,使用 JSON_CONTAINS() 函数即可轻松完成。
SELECT * FROM table
where JSON_CONTAINS(column, 'joe','$.name');
Postgres 语法
当您知道保存数据的密钥时:
SELECT column_name from table_name where column_name->>'key' LIKE '%QUERYSTRING%';
当您不知道保存数据的密钥时:
SELECT column_name from table_name where column_name::text LIKE '%QUERYSTRING%';
您可以通过以下查询在 JSON 数组中搜索匹配项:
SELECT JSON_EXTRACT(COLUMN, "$.names") AS NAME
FROM TABLE JSON_EXTRACT(COLUMN, "$.names") != ""
将 TABLE 替换为您的 table 名称,将 COLUMN 替换为 table 中的列名称。 我在你的问题中提到的密钥名称。