sql - 如何在 MariaDB 的“WHERE IN”子句中使用 JSON 数组
问题描述
我正在使用 MariaDB 10.2 版
我有一个 GUID 数组作为 JSON 存储在一个表中,我想从另一个表中选择 ID 与 JSON 数组中的任何 GUID 匹配的行。
group_table:
id json_data
-- ---------
23 ["69CF6C989F3942889305249573D1A08D","00E534B77C9A481596BB84947A58F7A4"]
child_table:
child_id some_data
-------- ---------
69CF6C989F3942889305249573D1A08D child one
00E534B77C9A481596BB84947A58F7A4 child two
我想做的是:
SELECT * from child_table where child_id in (select json_data from group_table where id = 23)
解决方案
修改 Pilosa 的答案我对其进行了修改以在 JSON 对象键上运行搜索。因此,如果我们将示例修改为如下所示:
store_table:
store_id json_data
-------- ---------
23 {"stock": {"apple":"73", "banana":"pieces"}}
24 {"stock": {"pear":"28", "plum":"52"}}
fruit_table:
fruit pricing_metric
-------- --------------
apple pounds
plum pounds
banana units
pear pounds
pineapple units
注意大括号 { }。我们可以根据 store_table 中的 json_data 从fruit_table 中选择pricing_metric,如下所示:
SELECT
*
FROM
fruit_table
WHERE
JSON_SEARCH(
(
SELECT JSON_KEYS(json_data, '$.stock')
FROM store_table
WHERE store_id = 23
),
'one',
HEX(user_pk)
) IS NOT NULL;
这将返回:
+----------------------------+
| fruit | pricing_metric |
+----------------------------+
| apple | pounds |
| banana | units |
+----------------------------+
推荐阅读
- excel - 如何使用 OptionBox 来驱动具有工作表中选择性值的 ComboBox 的值?
- three.js - Three.js/webgl RayCasting Sprites 在具有透明度或替代方案的场景中
- vba - 在另一个子例程中运行一个子例程 - 编译错误:参数不是可选的
- typescript - 使用 Object.keys 和减少对象键
- java - 如何使合并的单元格将其对应的单元格从另一列分组?
- css - 打字机动画删除字母的某些部分
- c# - 为另一列中的每个相同值查找列的最小值和最大值
- node.js - 加密密钥所需的密码
- ddmathparser - 表达式(字符串:)未在 DDMathParser 中解析正确的结果
- javascript - 异步方法中的 Promise.all