Подтвердить что ты не робот

Запрос PostgreSQL с "ANY" не работает

SELECT "Ticket_id"  FROM "Tickets"
 WHERE "Status" = 1 AND ("Ticket_id" !=  ANY(array[1,2,3])) Limit 6

И результат 1,2,3,4,5,6

4b9b3361

Ответ 1

Вы хотите использовать ALL, а не ANY. Из точное руководство:

9.21.3. ЛЮБОЙ/НЕКОТОРЫЙ (массив)

expression operator ANY (array expression)

[...] Левое выражение оценивается и сравнивается с каждым элементом массива с использованием заданного оператора , который должен приводить к логическому результату. Результатом ANY является "true", если получен какой-либо истинный результат.

Итак, если мы скажем так:

1 != any(array[1,2])

тогда мы получим true, так как (1 != 1) or (1 != 2) - true. ANY по существу является оператором OR. Например:

=> select id from (values (1),(2),(3)) as t(id) where id != any(array[1,2]);
 id 
----
  1
  2
  3
(3 rows)

Если мы посмотрим на ALL, мы увидим:

9.21.4. ALL (массив)

expression operator ALL (array expression)

[...] Левое выражение оценивается и сравнивается с каждым элементом массива с использованием заданного оператора , который должен приводить к логическому результату. Результатом ALL является "true", если все сравнения имеют значение true...

поэтому, если мы скажем так:

1 != all(array[1,2])

то мы получим false, так как (1 != 1) and (1 != 2) является ложным, и мы видим, что ALL по существу является оператором AND. Например:

=> select id from (values (1),(2),(3)) as t(id) where id != all(array[1,2]);
 id 
----
  3
(1 row)

Если вы хотите исключить все значения в массиве, используйте ALL:

select "Ticket_id"
from "Tickets"
where "Status" = 1
  and "Ticket_id" != all(array[1,2,3])
limit 6

Ответ 2

Вы имеете в виду:

"Ticked_id" NOT IN (1,2,3)