【问题标题】:MySQL JSON "NOT In" is not workingMySQL JSON“不在”不起作用
【发布时间】: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。您的问题非常好,并且具有回答它所需的一切。我对其进行了一些编辑以使其更具可读性。

标签: mysql json notin


【解决方案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 对象是动态的。

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2020-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多