5

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

提前致谢!

4

1 回答 1

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
);

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

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

于 2020-11-10T18:22:21.190 回答