Использование нескольких предложений HAVING в инструкции SQL с использованием JSON_EXTRACT

Я использую 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 И workflow_type = 'rule'

Как мне изменить свой запрос, чтобы сделать это, поскольку кажется, что MySQL не допускает несколько условий HAVING


person Zabs    schedule 05.06.2020    source источник
comment
Не связано, но: не существует такой вещи, как MYSQL 6.x (они перескочили с 5.7 на 8.0).   -  person GMB    schedule 05.06.2020


Ответы (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
person GMB    schedule 05.06.2020