如何限制 JSON_CONTAINS 只返回正值?

Posted

技术标签:

【中文标题】如何限制 JSON_CONTAINS 只返回正值?【英文标题】:How to restrain JSON_CONTAINS to return only positive values? 【发布时间】:2021-08-09 04:36:53 【问题描述】:

给定下表 DEMO(id 为 INT,city 为 JSON):

| id   | cities
| 1    | ['Atlanta', 'Boston']
| 2    | ['New York', 'Berlin']
| 3    | ['Paris', 'Berlin']
| 4    | ['Paris', 'Berlin']
| 5    | ['Paris', 'Berlin']
| 6    | ['Paris', 'Berlin']  

在城市中寻找“纽约”的记录时,我可以使用 JSON_CONTAINS 并且效果很好:

SELECT id, JSON_CONTAINS(details, '"New York"', "$.cities") as `NY` FROM `DEMO`

结果将是:

| id   | NY
| 1    | 0
| 2    | 1
| 3    | 0
| 4    | 0
| 5    | 0
| 6    | 0

是否可以只返回 1 的结果?

我正在使用 CTE 作为解决方法:

WITH `TMP_DEMO` AS (SELECT JSON_CONTAINS(details, '"New York"', "$.cities") AS `NY` FROM `DEMO`)
SELECT * FROM `TMP_DEMO` WHERE `NY` = 1

结果是:

| id   | NY
| 2    | 1

是否有一个设置或标志可以只返回找到的带有 JSON_CONTAINS 的记录?

【问题讨论】:

SELECT 列表不能用于过滤数据,必须在WHERE 子句中完成。 很好的观察。我正在浏览 JSON 类型文档,所有示例都使用 SELECT 列表中的 JSON 函数。您的回答让我更进一步,再次感谢! 我说的是一般查询,这不是 JSON 特有的。 如果你写SELECT name, age > 50 as old,如果你只想要老人,你也会遇到同样的问题。 条件只是一个返回真或假的表达式。您可以在任何允许使用表达式的地方使用它:在 SELECT、在 WHERE、在 HAVING 中。 【参考方案1】:

您可以使用HAVING 来完成此操作而无需 CTE。

SELECT id, JSON_CONTAINS(details, '"New York"', "$.cities") as `NY` 
FROM `DEMO`
HAVING NY = 1

或者您可以将条件移到WHERE 子句中。

SELECT id, 1 AS NY
FROM DEMO
WHERE JSON_CONTAINS(details, '"New York"', "$.cities")

【讨论】:

我确实尝试过having,但我一定做错了什么,因为它返回了一个错误,你的代码有效。第二个解决方案很好,我会用那个,谢谢!

以上是关于如何限制 JSON_CONTAINS 只返回正值?的主要内容,如果未能解决你的问题,请参考以下文章

如何告诉 SQL 在“出现正值”时返回 TRUE 而不是使用 SUM(field) >0 条件

JSON_CONTAINS() 与 MySQL 中的 JSON 对象数组

MySQL JSON - 使用 IN 语句 | json_contains

JSON_CONTAINS 无法从 MySQL 中找到

MySQL 过滤 JSON_CONTAINS 数组中的任何值

使用 MariaDB 在 JSON_CONTAINS() 中未考虑德语变音符号