Emuleert EVERY()
met CASE
en SUM()
In feite, dit artikel beschrijft hoe EVERY()
kan worden geëmuleerd via CASE
en SUM()
. De volgende twee uitspraken zijn equivalent:
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;
Hetzelfde geldt voor de EVERY()
vensterfunctie:
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;
SQL-standaard
De SQL:2008
standaard vermeldt de EVERY
aggregatiefunctie:
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
| [...]
Maar "geavanceerde" SQL-standaardfuncties worden niet vaak geïmplementeerd door databases. Oracle 11g ondersteunt het bijvoorbeeld niet, en SQL Server 2012 .
Met HSQLDB
maar misschien heb je meer geluk. HSQLDB 2.x voldoet zeer goed aan de normen, ook MySQL kent de BIT_AND()
aggregatiefunctie, een niet-standaard alias voor EVERY()
, ook ondersteund door Postgres.
Let op, in sommige databases kunnen door de gebruiker gedefinieerde statistische functies worden geschreven, dus u kunt net zo goed EVERY()
implementeren jezelf.