У меня есть утверждение, где оно работает, если я удалю свое CASE WHEN 1 != 1
условие. Я получаю обратно микросообщения с m.content = '<p>hi</p>'
и теги с ARRAY['hello', 'gday']
.
Мне известно, что мое предложение HAVING
должно по-прежнему выполняться и возвращать микросообщения с соответствующими тегами, когда условие WHERE CASE WHEN
оценивается как false
IE, оно не фильтруется по m.content = '<p>hi</p>'
и возвращает микросообщения, которые имеют ARRAY['hello', 'gday']
теги, связанные с ними.
Но это не тот случай, когда мое условие WHERE
не выполняется, потому что условие CASE
оценивается как false
, кажется, HAVING
также не не запускается, и я вернул 0 результатов. Является ли это ожидаемым поведением и если да, то почему ??
SELECT m.*
FROM microposts AS m
JOIN taggings tt ON m.id = tt.taggable_id
JOIN tags t ON t.id = tt.tag_id
WHERE CASE WHEN 1 != 1 THEN m.content = '<p>hi</p>' END\
GROUP BY m.id
HAVING ARRAY_AGG(t.name ORDER BY t.name)::text[] @> ARRAY['hello', 'gday']
РЕДАКТИРОВАТЬ Фактический код с ruby интерполяцией строк
SELECT m.*
FROM microposts AS m
JOIN taggings tt ON m.id = tt.taggable_id
JOIN tags t ON t.id = tt.tag_id
WHERE CASE WHEN #{my_string} != '' THEN m.content = #{my_string} END
GROUP BY m.id
HAVING ARRAY_AGG(t.name ORDER BY t.name)::text[] @> ARRAY['hello', 'gday']