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.