sql >> Databáze >  >> RDS >> PostgreSQL

Existuje nějaký ekvivalent k Postgresql KAŽDÉ agregační funkci na jiných RDBMS?

Emulace EVERY() s CASE a SUM()

Ve skutečnosti tento článek popisuje, jak EVERY() lze emulovat pomocí CASE a SUM() . Následující dva příkazy jsou ekvivalentní:

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;

Totéž platí pro EVERY() funkce okna:

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;

Standard SQL

SQL:2008 standard zmiňuje EVERY agregační funkce:

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

Ale "pokročilé" standardní funkce SQL nejsou často implementovány databázemi. Oracle 11g například jej nepodporuje ani SQL Server 2012 .

S HSQLDB , můžete však mít větší štěstí. HSQLDB 2.x je velmi kompatibilní se standardy, také MySQL zná BIT_AND() agregační funkce, což je nestandardní alias pro EVERY() , také podporovaný Postgres.

Všimněte si, že některé databáze umožňují zápis uživatelem definovaných agregačních funkcí, takže můžete také implementovat EVERY() sebe.




  1. Objekty podpory diagramu databáze nelze nainstalovat ... žádný platný vlastník

  2. Počítání s podmínkami

  3. Vybrat všechna data zahrnout další tabulku, i když je null

  4. jak vložit velký soubor do BLOB (Oracle) bez načtení celého souboru do paměti?