使用 JSON_EXTRACT 在 SQL 语句上使用多个 HAVING 子句



我正在使用带有 JSON 函数的 MYSQL 6.x,并且有以下查询,我正在尝试使用 WHERE 或必须限制记录集 - 有一个名为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 条件

您肯定可以在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)

最新更新