PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Existe algum equivalente à função agregada do Postgresql EVERY em outros RDBMS?

Emulando EVERY() com CASE e SUM()


Na verdade, este artigo descreve como EVERY() pode ser emulado via CASE e SUM() . As duas afirmações a seguir são equivalentes:
SELECT EVERY(id < 10)
FROM book

SELECT CASE SUM(CASE WHEN id < 10 THEN 0 ELSE 1 END) 
         WHEN 0 THEN 1 
         ELSE 0 
       END
FROM book;

O mesmo vale para EVERY() função da janela:
SELECT 
  book.*, 
  EVERY(title LIKE '%a') OVER (PARTITION BY author_id)
FROM book

SELECT
  book.*,
  CASE SUM(CASE WHEN title LIKE '%a' THEN 0 ELSE 1 END)
       OVER(PARTITION BY author_id)
    WHEN 0 THEN 1 
    ELSE 0
  END
FROM book;

Padrão SQL


O SQL:2008 padrão menciona o EVERY função agregada:
10.9 <aggregate function>

[...]

<aggregate function> ::=
  COUNT <left paren> <asterisk> <right paren> [ <filter clause> ]
  | <general set function> [ <filter clause> ]
  | <binary set function> [ <filter clause> ]
  | <ordered set function> [ <filter clause> ]

<general set function> ::=
  <set function type> <left paren> [ <set quantifier> ]
  <value expression> <right paren>

<set function type> ::=
  <computational operation>

<computational operation> ::=
  AVG
  | MAX
  | MIN
  | SUM
  | EVERY
  | [...]

Mas os recursos padrão SQL "avançados" não são frequentemente implementados pelos bancos de dados. Oracle 11g por exemplo, não suporta, nem SQL Server 2012 .

Com HSQLDB , no entanto, você pode ter mais sorte. HSQLDB 2.x é muito compatível com os padrões, também MySQL conhece o BIT_AND() função agregada, que é um alias não padrão para EVERY() , também suportado pelo Postgres.

Observe que alguns bancos de dados permitem escrever funções agregadas definidas pelo usuário, então você também pode implementar EVERY() você mesma.