【问题标题】:Why JSON_EXTRACT wildcard with LIKE% or %LIKE does not work in MySQL database?为什么带有 LIKE% 或 %LIKE 的 JSON_EXTRACT 通配符在 MySQL 数据库中不起作用?
【发布时间】:2019-08-14 08:28:23
【问题描述】:

我需要使用 JSON 数据在 MYSQL 表中搜索数据。使用 JSON_EXTRACT(@json, "$.link") LIKE '%http%' 按预期工作。但是LIKE 'http%' or '%http' 没有!

这是否意味着 JSON_EXTRACT 不能与单个通配符选择匹配一起使用?

示例:

这是我的 JSON

set @json = '{"link": "https://www.google.com"}' ; 
select JSON_EXTRACT(@json, "$.link") like '%com'; 
-- returns 0

select JSON_EXTRACT(@json, "$.link") like 'http%' ; 
-- returns 0

select JSON_EXTRACT(@json, "$.link") like '%google%' ; 
select JSON_EXTRACT(@json, "$.link") like '%http%' ; 
select JSON_EXTRACT(@json, "$.link") like '%com%' ; 
-- returns 1 !

下面是 Fiddle 中的一个示例:https://www.db-fiddle.com/f/7yPvfa2UZsZLdYSxdsnecx/0

【问题讨论】:

    标签: mysql json mysql-5.7 json-extract


    【解决方案1】:

    JSON_EXTRACT 仍然返回 JSON。它不会返回“原始”值,尽管当您使用它来提取单个数字时可能会产生这种印象,因为 JSON 表示数字的方式与 SQL 兼容。字符串不是这种情况。

    换句话说:

    set @json = '{"link": "https://www.google.com"}' ; 
    
    select JSON_EXTRACT(@json, "$.link"); 
    

    返回"https://www.google.com",而不是https://www.google.com,并且您的LIKE 必须考虑双引号。

    要将 JSON 字符串转换为实际的 MySQL 字符串,请使用 JSON_UNQUOTE()

    【讨论】:

    • 谢谢!也就是说,我需要选择select json_extract(@json, "$.link") like '"http%' ; !我相信,使用JSON_UNQUOTE() 将是一个额外的步骤,但不建议提高性能。
    • 这取决于你想要什么。 正式正确的方法是在处理字符串时始终使用JSON_UNQUOTE,因为无法保证JSON 字符串看起来不像{"link": "\u0068\u0074\u0074\u0070\u0073\u003a\u002f\u002f\u0077\u0077\u0077\u002e\u0067\u006f\u006f\u0067\u006c\u0065\u002e\u0063\u006f\u006d"}。一旦解码,它就是{"link":"https://www.google.com"},但只有与JSON_UNQUOTE 的比较才会成功。这是一个极端的例子,但它是完全有效的,你的代码不应该出错。
    • JSON_EXTRACT 已经是一项昂贵的操作。它涉及解释路径、解析 JSON、运行路径以获取结果,以及将这些结果再次序列化为 JSON - 对于查询中的每一行。不要假设JSON_UNQUOTE 会给已经很差的平衡增加太多。另外 - 快速运行的错误代码并不值得。
    • 想一想,由于 JSON_EXTRACT 涉及 JSON 序列化步骤,无论输入字符串如何,您可能永远不会真正从中得到"\u0068\u0074\u0074\u0070..."。但是您仍然受制于 MySQL 内置的 JSON 序列化程序认为它应该对字符串执行的任何操作,并且在 JSON 中表示字符串的方法不止一种,例如在变音符号方面。
    • 那……没有任何意义。这些怎么可能不同? db-fiddle.com/f/tN9Sm8XSwPq959iCdYHgZa/0
    【解决方案2】:

    请试试这个。 JSON_UNQUOTE(JSON_EXTRACT(@json, '$.like')) LIKE '%com%'

    【讨论】:

      猜你喜欢
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2015-09-05
      • 2023-04-11
      • 1970-01-01
      相关资源
      最近更新 更多