检查一个元素是不是包含在MySql中一个json列的值(数组)中

Posted

技术标签:

【中文标题】检查一个元素是不是包含在MySql中一个json列的值(数组)中【英文标题】:Check if an element is contained in the values ​(array) of a json column in MySql检查一个元素是否包含在MySql中一个json列的值(数组)中 【发布时间】:2021-02-08 14:15:14 【问题描述】:

我在mysql的一个json列的一个单元格内有以下值:


    "produttori": [
        "8",
        "9"
    ],
    "articoli_alternativi": [
        "3",
        "9"
    ],
    "articoli_accessori": [
        "5",
        "6",
        "7",
        "8"
    ],
    "tecnologie": [],
    "fornitori": [
        "9",
        "8"
    ],
    "classificazioni": [
        "3",
        "4"
    ]

我想做一个查询,根据数组中 fornitori 键处的值的存在来提取数据。 现在我已经尝试过了:

query = 'SELECT nome, formulati_commerciali FROM articolo WHERE JSON_CONTAINS(JSON_EXTRACT(dati, "$.fornitori"), "' + \
        value+'", "$")'

哪个打印是:

SELECT name, data FROM articolo WHERE JSON_CONTAINS(JSON_EXTRACT(data, "$.fornitori"), "8", "$")

基本上条件是value ("8") 必须在fornitori 列表内,否则跳过该元素。 不幸的是,查询没有产生任何结果。 我想知道如何在 MySql 中制定这样的查询。我会经常需要它们! 提前致谢!

【问题讨论】:

【参考方案1】:

你可以使用

SELECT data
  FROM 
  (
    SELECT  @i := @i + 1 AS rn,
            JSON_UNQUOTE(JSON_EXTRACT(data,CONCAT('$.fornitori[',@i-1,']'))) AS elm,
           data               
      FROM information_schema.tables 
     CROSS JOIN articolo 
     CROSS JOIN (SELECT @i := 0) r
  ) q
 WHERE elm = 8

为了在一个特定的范围内搜索特定的值 数组("fornitori")

Demo

【讨论】:

JSON_CONTAINS 更容易...【参考方案2】:

应该这样做:

SELECT name, data 
FROM articolo 
WHERE JSON_CONTAINS(data, '"8"', '$.fornitori')

8 周围的双引号很重要,以便正确匹配 JSON 数据。另一方面,查询始终对字符串文字使用单引号。

【讨论】:

Sir JSON_CONTAINS() 是预定义函数吗? @KUMAR dev.mysql.com/doc/refman/8.0/en/…(手册页适用于 8.0,但功能自 5.7.8 起存在)

以上是关于检查一个元素是不是包含在MySql中一个json列的值(数组)中的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle PL/SQL 中,如何检查 JSON 对象是不是包含特定键的元素

派斯帕克;用于检查列是不是包含列表元素之一的 UDF

检查包含 json 字符串的列是不是具有特定值

检查一列是不是包含另一列的所有值 - Mysql

有没有办法检查 MySQL 字典的元素是不是包含特定的整数?

检查 json 类型列 PostgreSQL 中是不是存在字段