使用JSON_EXTRACT在SQL语句中使用多个HAVING子句。

问题描述 投票:0回答:1

我正在使用MYSQL 6.x的JSON函数,并有以下查询,我试图使用WHERE或HAVING来限制记录集--有一列叫做 properties 这是JSON列,我需要在这个json数据上执行多个条件的搜索。

SELECT JSON_EXTRACT(properties,'$.identifier') AS identifier,
       JSON_EXTRACT(properties,'$.workflow_type') AS workflow_type
       FROM workflow_pages HAVING workflow_type;

这将返回以下数据:-

+------------+---------------+
| identifier | workflow_type |
+------------+---------------+
| 9          | "dictionary"  |
| 13         | "dictionary"  |
| 11         | "dictionary"  |
| 13         | "rule"        |
| 134        | "rule"        |
+------------+---------------+

我如何执行上述相同的查询,只返回具有以下条件的行?identifier IN 13, 134 AND workflow_type = 'rule'

我如何修改我的查询来做到这一点,因为似乎MySQL不允许多个HAVING条件。

mysql where-clause having mysql-json
1个回答
1
投票

你肯定可以有多个条件在 HAVING 子句 HAVING 子句)。)

SELECT 
    JSON_EXTRACT(properties,'$.identifier') AS identifier,
    JSON_EXTRACT(properties,'$.workflow_type') AS workflow_type
FROM workflow_pages 
HAVING workflow_type = 'rule' AND identifier IN (13, 134)

但我实际上并不建议这样表述查询;你实际上是在依赖MySQL对SQL标准的扩展,该扩展允许在 HAVING 句(且不含 GROUP BY),这使得查询在某些方面很不清楚。我发现,使用常规的 WHERE 子句并重复表达式。

SELECT 
    JSON_EXTRACT(properties,'$.identifier') AS identifier,
    JSON_EXTRACT(properties,'$.workflow_type') AS workflow_type
FROM workflow_pages 
WHERE 
    JSON_EXTRACT(properties,'$.identifier') IN (12, 134)
    JSON_EXTRACT(properties,'$.workflow_type') = 'rule'

或者,如果你有很多条件,不想做所有的输入,你可以使用一个子查询(我希望MySQL能做谓词推断,并在引擎盖下为你优化)。

SELECT *
FROM (
    SELECT 
        JSON_EXTRACT(properties,'$.identifier') AS identifier,
        JSON_EXTRACT(properties,'$.workflow_type') AS workflow_type
    FROM workflow_pages 
) t
WHERE workflow_type = 'rule' AND identifier IN 13, 134
© www.soinside.com 2019 - 2024. All rights reserved.