sql >> Databasteknik >  >> RDS >> PostgreSQL

Finns det någon motsvarighet till Postgresql VARJE aggregatfunktion på andra RDBMS?

Emulerar EVERY() med CASE och SUM()

Faktum är att den här artikeln beskriver hur EVERY() kan emuleras via CASE och SUM() . Följande två påståenden är likvärdiga:

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;

Detsamma gäller för EVERY() fönsterfunktion:

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

Men "avancerade" SQL-standardfunktioner implementeras inte ofta av databaser. Oracle 11g stöder till exempel inte det, inte heller SQL Server 2012 .

Med HSQLDB , men du kan ha mer tur. HSQLDB 2.x är mycket standardkompatibel, även MySQL känner till BIT_AND() aggregatfunktion, som är ett icke-standardalias för EVERY() , även stöds av Postgres.

Observera att vissa databaser tillåter skrivning av användardefinierade aggregerade funktioner, så du kan lika gärna implementera EVERY() dig själv.




  1. MySQL:välj det första elementet i en kommaseparerad lista

  2. SQL-fråga som skiljer mellan ß och ss

  3. Hur gör jag min databasanslutning säker?

  4. Hur visar jag fel för min MySQLi-fråga?