Это задокументированное поведение .
Для ANY
(или SOME
) с добавлением акцента:
Сравнивает значение для каждогозначение в списке или возвращается по запросу.Должно предшествовать =,! =,>, <, <=,> =.За ним может следовать любое выражение или подзапрос, который возвращает одно или несколько значений.
Оценивается как FALSE, если запрос не возвращает строк.
Для ALL
:
Сравнивает значение с каждым значением в списке или возвращается по запросу.Должно предшествовать =,! =,>, <, <=,> =.За ним может следовать любое выражение или подзапрос, который возвращает одно или несколько значений.
Оценивается как ИСТИНА, если запрос не возвращает строк.
По мере получения подзапросабез строк, поэтому ожидается, что версия ANY
оценивается как ложная, поскольку
select * from table1 a where a.age> all(select b.age from table2 b where b.age>50);
оценивается как (игнорируя то, что вы не можете явно указать true / false):
select * from table1 a where false; -- or more legally: where 1=0
и т. Д. Не возвращает строк;
Но условие ALL
оценивается как true, поскольку
select * from table1 a where true; -- or more legally: where 1=1
и поэтому возвращает все строки.