2 回答
TA贡献1801条经验 获得超8个赞
您只需使用json_contains()
:
select *
from mytable
where json_contains(data_column, '{ "barcode": "foo" }' , '$.placards')
此短语为:搜索路径 'placards' 下数组中包含候选对象的键/值对的任何元素'{ "barcode": "foo" }',其中 'foo' 是您搜索的条形码值。
set @data_column =
'{
"placards": [
{"barcode": "foo", "destination":"string", "weight":"string"},
{"barcode": "bar", "destination":"string", "weight":"string"}
]
}';
select json_contains(@data_column, '{ "barcode": "foo" }' , '$.placards') is_a_match;
| is_a_match |
| ---------: |
| 1 |
select json_contains(@data_column, '{ "barcode": "baz" }' , '$.placards') is_a_match;
| is_a_match |
| ---------: |
| 0 |
从 MySQL 8.0.17 开始,你甚至可以在嵌套的 json 数组上创建多值索引,这样数据库就不需要为此查询执行全表扫描:
alter table mytable
add index myidx( (cast(data_column -> '$.placards' as unsigned array)) );
TA贡献1793条经验 获得超6个赞
您必须使用 JSON_TABLE():
SELECT mytable.* FROM mytable,
JSON_TABLE(mytable.data_column, '$.placards[*]' COLUMNS (
barcode VARCHAR(100) PATH '$.barcode',
destination VARCHAR(100) PATH '$.destination',
weight VARCHAR(20) PATH '$.weight'
)) AS j
WHERE j.barcode = ?
如果将这些字段存储在普通列中而不是 JSON 中,则会简单得多。每个标语牌存储一行,并包含 barcode、description 和 weight 的单独列。
SELECT m.* FROM mytable AS m JOIN placards AS p ON m.id = p.mytableid
WHERE p.barcode = ?
我在 Stack Overflow 问题中看到的 MySQL 中 JSON 的大多数使用都是不必要的,因为数据不需要 JSON 的灵活性。针对 JSON 文档的查询很难编写,也很难优化。 JSON 还需要更多空间来存储相同的数据。
- 2 回答
- 0 关注
- 109 浏览
添加回答
举报