sql >> Database teknologi >  >> RDS >> PostgreSQL

Er der nogen ækvivalent til Postgresql HVER aggregatfunktion på andre RDBMS?

Emulering af EVERY() med CASE og SUM()

Faktisk denne artikel beskriver, hvordan EVERY() kan emuleres via CASE og SUM() . De følgende to udsagn er ækvivalente:

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;

Det samme gælder for EVERY() vinduesfunktion:

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

SQL:2008 standarden nævner EVERY aggregeret funktion:

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

Men "avancerede" SQL-standardfunktioner implementeres ikke ofte af databaser. Oracle 11g understøtter det for eksempel ikke, og det gør SQL Server 2012 .

Med HSQLDB dog kan du være mere heldig. HSQLDB 2.x er meget standardkompatibel, også MySQL kender BIT_AND() aggregeret funktion, som er et ikke-standard alias til EVERY() , også understøttet af Postgres.

Bemærk, nogle databaser giver mulighed for at skrive brugerdefinerede aggregerede funktioner, så du kan lige så godt implementere EVERY() dig selv.




  1. SQL Indsæt nye rækker i tabel for hvert felt i samme tabel

  2. 2 måder at slette duplikerede rækker i MariaDB (ignorerer primærnøgle)

  3. Skal jeg frigøre mysql-resultatet efter at have gemt det?

  4. MySQL vælg maksimal længde af matchende streng