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.