Mô phỏng EVERY()
với CASE
và SUM()
Trên thực tế, bài viết này mô tả cách EVERY()
có thể được mô phỏng qua CASE
và SUM()
. Hai câu lệnh sau là tương đương:
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;
Điều này cũng đúng với EVERY()
chức năng cửa sổ:
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;
Chuẩn SQL
SQL:2008
tiêu chuẩn đề cập đến EVERY
chức năng tổng hợp:
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
| [...]
Nhưng các tính năng tiêu chuẩn SQL "nâng cao" thường không được cơ sở dữ liệu thực hiện. Oracle 11g ví dụ:không hỗ trợ nó, SQL Server 2012 .
Với HSQLDB
, tuy nhiên, bạn có thể may mắn hơn. HSQLDB 2.x rất tuân thủ tiêu chuẩn, cũng MySQL biết BIT_AND()
hàm tổng hợp, là một bí danh không chuẩn cho EVERY()
, cũng được hỗ trợ bởi Postgres.
Lưu ý, một số cơ sở dữ liệu cho phép viết các hàm tổng hợp do người dùng xác định, vì vậy bạn cũng có thể triển khai EVERY()
bản thân bạn.