【问题标题】:Where condition in mysql with array valuemysql中带有数组值的条件
【发布时间】:2021-05-21 00:09:15
【问题描述】:

我有一张这样的桌子:

id values user_id
1 ["8","7","6"] 5

现在我在values 列上运行WHERE 条件的查询:

SELECT * from table_name WHERE values = ["8","7","6"]

但是 MySQL 返回这个错误:

错误代码:1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '["8","7","6"]' 附近使用的正确语法

【问题讨论】:

标签: mariadb


【解决方案1】:

如果您想比较严格相等,您希望将比较作为 JSON 对象进行。您可以使用 JSON_EXTRACT 将数据解析为 JSON 而不是文本:

SELECT * from table_name WHERE
  JSON_EXTRACT(`values`, '$') = JSON_EXTRACT('["8","7","6"]', '$');

只要您想要严格相等,您应该能够将它用于任何类型的 JSON。如果要返回与给定 JSON 对象匹配的所有行,请使用 JSON_CONTAINS

例如,要查找其中包含字符串 "8" 的所有值,您可以使用以下命令:

SELECT * from table_name WHERE JSON_CONTAINS(`values`, '"8"');

请注意,这种匹配并不像您想象的那么简单,它会匹配文档中的任何值。如果您的数据由 JSON 数组组成,这应该仍然足够。

【讨论】:

    【解决方案2】:

    有关您的列数据类型的信息,尤其是values 至关重要。由于该列存储了数字和非数字字符的混合,我们可以假设它可能存储在VARCHAR()TEXT 数据类型中。但是由于数据格式看起来像JSON 数组,因此列数据类型也有可能是JSON。现在这两种数据类型都有一个非常不同的查询结构。

    首先,让我们解决一些问题:

    1. 当单元格值包含除数字以外的其他字符时,它将被视为字符串。因此,使用纯 .. WHERE values = ["8","7","6"] 而不用引号 (') 括起来,您将得到 Error Code : 1064
    2. VALUES 在 MySQL 中是 a reserved word,所以如果你想坚持它作为你的表列名,你总是需要用反引号把它包装起来。如果没有,这也将返回Error Code : 1064
    .. WHERE `values` = ..
    

    现在让我们试试这个:

    1. 如果values 的列数据类型是VARCHAR()TEXT,您只需将搜索值简单地用单引号括起来,例如:
    SELECT * from table_name WHERE `values` = '["8","7","6"]';
    

    Refer this fiddle

    为 MariaDB 更新

    1. 如果values 的列数据类型为JSON,则如下所示:
    SELECT * from table_name where JSON_UNQUOTE(`values`)= '["8","7","6"]'
    

    Refer this fiddle for JSON

    我提到的 JSON 方法this MariaDB documentation

    P/S:根据本文档JSON is an alias for LONGTEXT introduced for compatibility reasons with MySQL's JSON data type。换句话说,当在 MariaDB 中创建具有 JSON 数据类型的表时,它将显示为 LONGTEXT,但除了普通的 LONGTEXT 数据类型之外还有额外的定义。 See this fiddle for more detail.

    【讨论】:

    • 我的值数据类型是长文本。
    • mysql 在我运行 SELECT * from table_name WHERE values->"$[0]" = '8' AND values->"$[1]" = ' 时给出 #1064 错误7' AND values->"$[2]" = '6';查询
    • 您的确切 MySQL 版本是多少?请运行SELECT @@version。并请发布完整的错误消息
    • 10.4.18-MariaDB
    • #1064 - 您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在 '>"$[0]" = '8' AND values->"$[1]" = '7' AND values- 附近使用的正确语法>"$[2]" = '3' AND `v...' 在第 2 行
    猜你喜欢
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 2016-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多