sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Hay algún equivalente a Postgresql CADA función agregada en otro RDBMS?

Emular EVERY() con CASE y SUM()

De hecho, este artículo describe cómo EVERY() se puede emular a través de CASE y SUM() . Las siguientes dos declaraciones son 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;

Lo mismo es cierto para EVERY() función de ventana:

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;

Estándar SQL

El SQL:2008 estándar menciona el EVERY función 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
  | [...]

Pero las características estándar de SQL "avanzadas" no suelen implementarse en las bases de datos. Oracle 11g por ejemplo, no lo admite, tampoco SQL Server 2012 .

Con HSQLDB , sin embargo, puede que tengas más suerte. HSQLDB 2.x cumple con los estándares, también MySQL conoce el BIT_AND() función agregada, que es un alias no estándar para EVERY() , también compatible con Postgres.

Tenga en cuenta que algunas bases de datos permiten escribir funciones agregadas definidas por el usuario, por lo que también puede implementar EVERY() usted mismo.