【发布时间】: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 中。