提问者:小点点

使用JSON_EXTRACT对SQL语句使用多个HAVING子句


我正在使用带有JSON函数的MySQL6.x,并且有下面的查询,我试图在这里使用,或者必须限制记录集-有一个名为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条件,如何修改查询以实现此目的


共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