计算在 MariaDB 10.4 中 json 列的数组中有多少行具有嵌套值

Count how many rows have a nested value in the arrays of a json column in MariaDB 10.4

我在 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 的单元格中数组(并因此计数)。 我想知道如何改进我的查询。

提前致谢!

为此,您需要提供 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