PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Gibt es ein Äquivalent zu Postgresql JEDER Aggregatfunktion auf anderen RDBMS?

Emulation von EVERY() mit CASE und SUM()

Tatsächlich ist dieser Artikel beschreibt, wie EVERY() kann über CASE emuliert werden und SUM() . Die folgenden beiden Anweisungen sind äquivalent:

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;

Dasselbe gilt für EVERY() Fensterfunktion:

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-Standard

Der SQL:2008 Standard erwähnt den EVERY Aggregatfunktion:

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
  | [...]

Aber "fortgeschrittene" SQL-Standardfunktionen werden nicht oft von Datenbanken implementiert. Oracle 11g beispielsweise nicht, und SQL Server 2012 .

Mit HSQLDB , aber vielleicht hast du mehr Glück. HSQLDB 2.x ist sehr standardkonform, auch MySQL kennt das BIT_AND() Aggregatfunktion, die ein nicht standardmäßiger Alias ​​für EVERY() ist , wird auch von Postgres unterstützt.

Beachten Sie, dass einige Datenbanken das Schreiben benutzerdefinierter Aggregatfunktionen ermöglichen, sodass Sie EVERY() genauso gut implementieren können selbst.