PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Existe-t-il un équivalent à la fonction d'agrégation Postgresql EVERY sur d'autres RDBMS?

Émuler EVERY() avec CASE et SUM()

En fait, cet article décrit comment EVERY() peut être émulé via CASE et SUM() . Les deux déclarations suivantes sont équivalentes :

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;

Il en va de même pour le EVERY() fonction fenêtre :

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;

Norme SQL

Le SQL:2008 standard mentionne le EVERY fonction d'agrégat :

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
  | [...]

Mais les fonctionnalités standard SQL "avancées" ne sont pas souvent implémentées par les bases de données. Oracle 11g par exemple, ne le prend pas en charge, pas plus que SQL Server 2012 .

Avec HSQLDB , cependant, vous pourriez être plus chanceux. HSQLDB 2.x est très conforme aux normes, également MySQL connaît le BIT_AND() fonction d'agrégation, qui est un alias non standard pour EVERY() , également pris en charge par Postgres.

Notez que certaines bases de données permettent d'écrire des fonctions d'agrégation définies par l'utilisateur, vous pouvez donc également implémenter EVERY() vous-même.