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

Mem*_*mmo 5 mariadb mysql-json 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"
    ]
}
Run Code Online (Sandbox Code Playgroud)

键 ( "0", "1", "2", "3") 是自动生成的。
我想计算每个数组的第二个元素与我在条件中传递的元素相同的行数。
现在我有能力做这样的事情:

query = '''SELECT COUNT(*) AS rowcount FROM ordine_al_fornitore WHERE JSON_CONTAINS(fca_ordinati, '"''' + myVar + '''"', '$.[*]')'''
Run Code Online (Sandbox Code Playgroud)

哪个打印是:

SELECT COUNT(*) AS rowcount FROM ordine_al_fornitore WHERE JSON_CONTAINS(fca_ordinati, '"Sacco da 5kg"', '$.[*]')
Run Code Online (Sandbox Code Playgroud)

我只知道如何以固定方式 ( $.[*])传递键,而实际上我想遍历键以检查该值是否存在于1数组的单元格中(并因此计数)。我想知道如何改进我的查询。

提前致谢!

ΔO *_*ro' 3

为此,您需要提供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
);
Run Code Online (Sandbox Code Playgroud)

这适用于 MySQL 5.7.22 或更高版本:https://www.db-fiddle.com/f/bNyV8wMbNhF1qTWBCBt7un/0

MariaDB 10.3 或更高版本:https://dbfiddle.uk/? rdbms=mariadb_10.3&fiddle=d1c3d750ee2ef58a60d234a58f0fc5d2

  • 另外,您可以尝试“WHERE JSON_CONTAINS(JSON_EXTRACT(fca_ordinati, '$.*[1]'), '"Sacco da 5kg"')`。 (2认同)
  • 很高兴它有效:-)我编辑的答案现在应该是正确的,即使对于 MariaDB 也是如此。`->` 运算符只是 MySQL 对 `JSON_EXTRACT` 的别名,MariaDB 不支持它。PS:请始终从平台和版本开始:-) 您询问了 MySQL,但您针对 MariaDB 测试了答案。 (2认同)