2016-07-15 1 views
0

Здесь я заметил, что в сравнениях строковых массивов Postgres мы должны дать массив после оператора сравнения. Для примера:Почему массив Postgres выполняется после сравнения при сравнении?

SELECT campaign_products 
FROM contacts 
WHERE 'PMP' LIKE ANY(campaign_products) limit 10; 

SELECT campaign_products 
FROM contacts 
WHERE 'as' = ANY(campaign_products); 

Но когда я использую, как показано ниже, что дает ошибку синтаксиса:

SELECT campaign_products 
from contacts 
where ANY(campaign_products) = 'as'; 

ERROR: syntax error at or near "ANY" 
LINE 1: SELECT campaign_products from contacts where ANY(campaign_pr... 

Может кто-нибудь объяснить мне это и дайте мне знать, если есть способ дать массив слева оператор сравнения.

ответ

1

Это стандарт SQL.

В ISO/IEC 9075-2 (2003), Фонд, определяется следующим образом:

8.8 <quantified comparison predicate>

Format

<quantified comparison predicate> ::= 
    <row value predicand> <quantified comparison predicate part 2> 

<quantified comparison predicate part 2> ::= 
    <comp op> <quantifier> <table subquery> 

<quantifier> ::= 
    <all> 
    | <some> 

<all> ::= ALL 

<some> ::= 
    SOME 
    | ANY 

Так что это вопрос, который вы должны были бы занять со стандартом SQL.

А если серьезно, зачем нужен ANY =? Не должно быть проблем с переключением сторон, чтобы сравнение было синтаксически правильным.

Подумайте, = ANY или = SOME как операторы, где левая сторона является значением, а правая сторона представляет собой набор значений. PostgreSQL расширяет стандартный синтаксис SQL, разрешая массивы с правой стороны.

+0

Я просто хочу знать, что происходит, и что такое сравнение строк и сравнение строк. Например: выберите идентификатор из контактов, где status = 'lead' limit 1; и выберите id из контактов, где «lead» = ANY (statuses) limit 1; дают мне результат, но выбирают id из контактов, где ANY (statuses) = 'lead' limit 1; ОШИБКА: синтаксическая ошибка в точке «ЛЮБОЕ» LINE 1: выберите идентификатор из контактов, где ANY (статусы) = 'lead' limit 1 ... – Pandu

+0

Это просто синтаксически неверно. Я отредактировал ответ, возможно, станет понятнее. '' должно быть прямо перед '' в синтаксической диаграмме. 'ANY' не принадлежит' <подзапрос таблицы> '. –