计算 MariaDB 10.4 中 json 列的数组中有多少行具有嵌套值
Posted
技术标签:
【中文标题】计算 MariaDB 10.4 中 json 列的数组中有多少行具有嵌套值【英文标题】:Count how many rows have a nested value in the arrays of a json column in MariaDB 10.4 【发布时间】:2021-02-16 22:51:19 【问题描述】:我在 MariaDB 10.4 的一个 json 列的单元格内有以下值:
"0": [
21,
"Pallet da 1250kg (50 * Sacco da 25kg)",
"1250",
"kg"
],
"1": [
21,
"Sfuso",
"12",
"kg"
],
"2": [
12,
"Sacco da 5kg",
"10",
"kg"
],
"3": [
12,
"Pallet da 2500kg (2 * Pallet da 1250kg (50 * Sacco da 25kg))",
"5000",
"kg"
]
自动生成密钥("0"
、"1"
、"2"
、"3"
)。
我想计算每个数组的第二个元素与我在条件中传递的元素相同的行数。
现在我有能力做这样的事情:
query = '''SELECT COUNT(*) AS rowcount FROM ordine_al_fornitore WHERE JSON_CONTAINS(fca_ordinati, '"''' + myVar + '''"', '$.[*]')'''
哪个打印是:
SELECT COUNT(*) AS rowcount FROM ordine_al_fornitore WHERE JSON_CONTAINS(fca_ordinati, '"Sacco da 5kg"', '$.[*]')
我只知道如何以固定方式传递密钥 ($.[*]
),而实际上我想遍历密钥以检查该值是否存在于数组的单元格 1
中(并因此计数) .
我想知道如何改进我的查询。
提前致谢!
【问题讨论】:
你用的是什么版本的 mysql? @wchiquito XAMPP 中的那个。我不太清楚,我该如何检索这些信息?但是 XAMPP 的版本是 v3.2.4 @Memmo serverguy.com/servers/check-mysql-version 我编辑了上面的问题,让读者更清楚这是 MariaDB,而不是 MySQL。自 2010 年以来,MariaDB 一直与 MySQL 慢慢分道扬镳,因此应将其视为具有不同功能的不同软件产品。 @BillKarwin 感谢您的支持!我以为 XAMPP 默认有 MySql。然后调查我发现它有mariaDB。我必须了解这些技术的文化。 【参考方案1】:为此,您需要为JSON_CONTAINS 提供一个平面字符串数组以供搜索。
a) JSON_EXTRACT(fca_ordinati, '$.*')
获取对象值的数组
b) JSON_EXTRACT(fca_ordinati, '$.*[1]')
获取每个条目的第二个值(索引 1)的数组
c) JSON_CONTAINS(..., '"Sacco da 5kg"')
在该数组中搜索字符串外观
SELECT COUNT(*)
FROM ordine_al_fornitore
WHERE JSON_CONTAINS(
JSON_EXTRACT(fca_ordinati, '$.*[1]'),
'"Sacco da 5kg"' -- note the string needs to have quotes
);
这适用于 MySQL 5.7.22 或更高版本:https://www.db-fiddle.com/f/bNyV8wMbNhF1qTWBCBt7un/0
以及 MariaDB 10.3 或更高版本:https://dbfiddle.uk/?rdbms=mariadb_10.3&fiddle=d1c3d750ee2ef58a60d234a58f0fc5d2
【讨论】:
我有一个错误com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '> '$.*[1]', '"Sacco da kg (Colli)"' )' at line 1
。这是我的打印查询:SELECT COUNT(*) AS rowcount FROM ordine_al_fornitore WHERE JSON_CONTAINS(fca_ordinati -> '$.*[1]', '"Sacco da 5kg"' );
这很奇怪,因为它适用于 DB Fiddle。你运行的是哪个版本 (select @@version;
)?
另外,你可以试试WHERE JSON_CONTAINS(JSON_EXTRACT(fca_ordinati, '$.*[1]'), '"Sacco da 5kg"')
。
数据库服务器:10.4.11-MariaDB - mariadb.org
很高兴它可以工作 :-) 即使对于 MariaDB,我编辑的答案现在也应该是正确的。 ->
运算符只是 MySQL 在 JSON_EXTRACT
上的别名,MariaDB 不支持。 PS:请始终从平台和版本开始 :-) 您询问过 MySQL,但您针对 MariaDB 测试答案。以上是关于计算 MariaDB 10.4 中 json 列的数组中有多少行具有嵌套值的主要内容,如果未能解决你的问题,请参考以下文章
从 mariadb:10 切换到 mariadb:10.4 映像时,docker 容器不断重启
使用 MariaDB 10.4 和 eclipselink 的 java @GeneratedValue (strategy = GenerationType.IDENTITY) 问题