【问题标题】:Using multiple HAVING clause on SQL statement using JSON_EXTRACT在使用 JSON_EXTRACT 的 SQL 语句上使用多个 HAVING 子句
【发布时间】:2020-06-05 13:01:54
【问题描述】:

我正在使用带有 JSON 函数的 MYSQL 6.x 并且有以下查询,我试图使用 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, 134workflow_type = 'rule'

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

【问题讨论】:

  • 无关,但是:没有像 MYSQL 6.x 这样的东西(他们从 5.7 跳到 8.0)。

标签: mysql sql json where-clause having-clause


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    相关资源
    最近更新 更多