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 数据库的查询在 node.js 和 JSON.stringify() 中返回 [Object] [Object] 似乎不起作用
在 PHP 7.0 中编码多维数组不起作用 (json_encode)