如何限制 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