MySQL JSON“不在”不起作用

Posted

技术标签:

【中文标题】MySQL JSON“不在”不起作用【英文标题】:MySQL JSON "NOT In" is not working 【发布时间】:2018-05-01 06:44:55 【问题描述】:

我有两个表,每个表都有其 JSON 列。我想从第一个中选择不在第二个中的行,搜索条件是 JSON 的属性之一。

Request.Details->'$.Key'有以下数据

"9523beaf-934b-e811-80d1-6a077df8507e"
"cf287991-434c-e811-80d1-6a077df8507e"

Response.response->'$.Key'有以下数据

"9523beaf-934b-e811-80d1-6a077df8507e"

现在我测试了这个查询:

select msr.`Details`->'$.Key' m
  from `Request` msr
 where msr.`Details`->'$.Key' in (select `response`->'$.Key' from `Response`);

它工作正常并返回

"9523beaf-934b-e811-80d1-6a077df8507e"

但是当我使用NOT IN 时,它会返回一个空表。

select msr.`Details`->'$.Key' m
  from `Request` msr
 where msr.`Details`->'$.Key' not in (select `response`->'$.Key' from `Response`);

【问题讨论】:

欢迎来到 Stack Overflow。您的问题非常好,并且具有回答它所需的一切。我对其进行了一些编辑以使其更具可读性。 【参考方案1】:

你需要处理NULL:

select msr.`Details`->'$.Key' m 
from `Request` msr 
where msr.`Details`->'$.Key' not in (select COALESCE(`response`->'$.Key','') 
                                     from `Response`)

来自notin tag:

NOT IN 运算符是“NOT”逻辑运算符与“IN”比较运算符的并集。它可用于指定不应出现在 WHERE 子句中的多个值。 请注意,NOT IN <null> 永远不会是真的!

【讨论】:

【参考方案2】:

实际上问题在于存储在两个表中的数据,一些值为空,而另一些为字符串NOT UUID 字符串。

我猜 InnodB 会尝试理解存储变量的格式然后对其进行处理,但我认为没有任何理由这样做,因为 JSON 对象是动态的。

【讨论】:

以上是关于MySQL JSON“不在”不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有 mysql JSON 列的 IN 语句不起作用?

来自 MySQL 数据库的查询在 node.js 和 JSON.stringify() 中返回 [Object] [Object] 似乎不起作用

将 JSON 传递给 PHP 不起作用

在 PHP 7.0 中编码多维数组不起作用 (json_encode)

如果不在事务中,休眠 session.update 不起作用

SwiftUI:如果不在列表中,NavigationLink 不起作用