sql >> Database >  >> RDS >> PostgreSQL

Is er een equivalent voor Postgresql ELKE geaggregeerde functie op andere RDBMS?

Emuleert EVERY() met CASE en SUM()

In feite, dit artikel beschrijft hoe EVERY() kan worden geëmuleerd via CASE en SUM() . De volgende twee uitspraken zijn equivalent:

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;

Hetzelfde geldt voor de EVERY() vensterfunctie:

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

De SQL:2008 standaard vermeldt de EVERY aggregatiefunctie:

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

Maar "geavanceerde" SQL-standaardfuncties worden niet vaak geïmplementeerd door databases. Oracle 11g ondersteunt het bijvoorbeeld niet, en SQL Server 2012 .

Met HSQLDB maar misschien heb je meer geluk. HSQLDB 2.x voldoet zeer goed aan de normen, ook MySQL kent de BIT_AND() aggregatiefunctie, een niet-standaard alias voor EVERY() , ook ondersteund door Postgres.

Let op, in sommige databases kunnen door de gebruiker gedefinieerde statistische functies worden geschreven, dus u kunt net zo goed EVERY() implementeren jezelf.




  1. Kan mySQL-COUNT van de 3e tafel niet zien

  2. selecteer alle kolommen die niet in een andere tabel staan ​​laravel 5.5

  3. PropertyAccessException:fout bij toegang tot veld

  4. Voeg twee tabellen samen met alle records