我正在使用带有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,134
和workflow_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