【问题标题】:How to restrain JSON_CONTAINS to return only positive values?如何限制 JSON_CONTAINS 只返回正值?
【发布时间】: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 中。

标签: mysql json mariadb


【解决方案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,但我一定做错了什么,因为它返回了一个错误,你的代码有效。第二个解决方案很好,我会用那个,谢谢!
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-28
  • 2020-01-14
  • 2015-11-18
  • 1970-01-01
  • 2023-02-04
相关资源
最近更新 更多