如何解决使用AND NOT CONTAINS查询mysql json列数组mysql 5.7
我有一个带有json列的表,其中包含一个对象数组,如下所示:
create table test_json (json_id int not null primary key,json_data json not null) select 1 as json_id,'[{"category":"circle"},{"category":"square","qualifier":"def"}]' as json_data union select 2 as json_id,'[{"category":"triangle","qualifier":"xyz"},{"category":"square"}]' as json_data;
+---------+----------------------------------------------------------------------------------------+
| json_id | json_data |
+--------------------------------------------------------------------------------------------------+
| 1 | [{"category":"circle"},"qualifier":"def"}] |
| 2 | [{"category":"triangle",{"category":"square"}] |
+---------+----------------------------------------------------------------------------------------+
我希望能够查询该表以查找包含数组中的json对象且“类别”值为“ square”且没有“”的任何行(json_id
)限定符”属性。
上面的示例表只是一个示例,我正在寻找一个可以在json数组中的数百行和数百个对象上工作的查询。
解决方法
在MySQL 8.0中,您将为此使用JSON_TABLE():
mysql> select json_id,j.* from test_json,json_table(json_data,'$[*]' columns (
category varchar(20) path '$.category',qualifier varchar(10) path '$.qualifier')) as j
where j.category = 'square' and j.qualifier is null;
+---------+----------+-----------+
| json_id | category | qualifier |
+---------+----------+-----------+
| 2 | square | NULL |
+---------+----------+-----------+
目前尚不清楚为什么要为此使用JSON。最好以常规方式存储数据,每个对象一行,并以category
和qualifier
作为单独的列。
针对普通列的查询要简单得多,并且您可以使用索引轻松优化查询:
select * from mytable where category = 'square' and qualifier is null;
我发现了仅使用MySQL 5.7 JSON函数的另一种解决方案:
select json_id,json_data from test_json
where json_extract(json_data,concat(
trim(trailing '.category' from
json_unquote(json_search(json_data,'one','square'))
),'.qualifier')
) is null
这假定值'square'仅 作为"category"
字段的值出现。在您的简单示例中确实如此,但是我不知道在您的真实数据中是否如此。
结果:
+---------+------------------------------------------------------------------------+
| json_id | json_data |
+---------+------------------------------------------------------------------------+
| 2 | [{"category": "triangle","qualifier": "xyz"},{"category": "square"}] |
+---------+------------------------------------------------------------------------+
无论何时您在WHERE子句中的条件中引用JSON列,我仍然认为它是CodeSmell。我理解您的评论,这是一个简化的示例,但是无论JSON结构如何,如果您需要执行搜索条件,如果将数据存储在规范化表的常规列中,您的查询将更容易开发。
,您的要求不明确。您的两个SQL记录都没有此类属性,但JSON对象却具有。也许您尝试查找具有此类对象的任何记录。因此,以下是您的答案:
create table test_json (json_id int not null primary key,json_data json not null) select 1 as json_id,'[{"category":"circle","qualifier":"abc"},{"category":"square","qualifier":"def"}]' as json_data union select 2 as json_id,'[{"category":"triangle","qualifier":"xyz"},{"category":"square"}]' as json_data;
select * from test_json;
select * from test_json where 'square' in (JSON_EXTRACT(json_data,'$[0].category'),JSON_EXTRACT(json_data,'$[1].category'))
AND (JSON_EXTRACT(json_data,'$[0].qualifier') is NULL || JSON_EXTRACT(json_data,'$[1].qualifier') is NULL);
请参见Online Demo
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。