Емулиране на EVERY()
с CASE
и SUM()
Всъщност тази статия описва как EVERY()
може да се емулира чрез CASE
и SUM()
. Следните две твърдения са еквивалентни:
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;
Същото важи и за EVERY()
функция прозорец:
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 стандарт
SQL:2008
стандартът споменава EVERY
агрегатна функция:
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
| [...]
Но „усъвършенстваните“ стандартни функции на SQL често не се изпълняват от бази данни. Oracle 11g например не го поддържа, нито SQL Server 2012 .
С HSQLDB
, но може да имате повече късмет. HSQLDB 2.x е много съвместим със стандартите, също MySQL познава BIT_AND()
агрегатна функция, която е нестандартен псевдоним на EVERY()
, също поддържан от Postgres.
Имайте предвид, че някои бази данни позволяват писане на дефинирани от потребителя агрегатни функции, така че можете също така да приложите EVERY()
себе си.