2010-09-25 15 views
4

Ma compréhension est que GREATEST() et LEAST() ne font pas partie de la norme SQL, mais sont très courants.PLUS GRAND et MOINS dans la norme SQL

Je me demande, est-il un moyen de cloner la fonctionnalité de plus grand maintien dans le standard SQL?

SELECT id, GREATEST(1,2,3,4,5,6,7) AS number FROM table 

La pleine requête:

SELECT SUBSTR(section,1,2) AS campus, 
      AVG(GREATEST(maximum - enrolled, 0)) AS empty 
    FROM sectionrun 
    WHERE coursenumber = '105' AND subject = 'ENGL' 
GROUP BY campus 
+2

Pour quelle base de données? GREATEST & LEAST sont pris en charge par [PostgreSQL] (http://www.postgresql.org/docs/8.1/interactive/functions-conditional.html), [MySQL] (http://dev.mysql.com/doc/refman /4.1/fr/comparison-operators.html#function_greatest), [Oracle] (http://techonthenet.com/oracle/functions/greatest.php). SQL Server est le seul des majors qui ne prend pas en charge GREATEST/LEAST. –

+1

Je sais que PostgreSQL et MySQL supportent GREATEST/LEAST. Ma question concerne le standard SQL http://en.wikipedia.org/wiki/SQL#Standardization – WalterJ89

+0

Voir aussi: http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns –

Répondre

3

Vous pouvez utiliser l'expression CASE:

SELECT SUBSTR(section,1,2) AS campus, 
      AVG(CASE WHEN maximum - enrolled > 0 
        THEN maximum - enrolled 
        ELSE 0 
       END) AS empty 
    FROM sectionrun 
    WHERE coursenumber = '105' AND subject = 'ENGL' 
GROUP BY campus 
+0

Awsome, Je vous remercie. – WalterJ89

+3

Cela ne va pas très bien à plus de deux valeurs. C'est bien pour l'exemple spécifique OP, mais ne répond pas à la question plus générale. –

2
GREATEST(1,2,3,4,5,6,7) AS number 

peut devenir

(select max(tmp) from (
     select 1 tmp from dual 
     union all 
     select 2 tmp from dual 
     union all 
     select 3 tmp from dual 
     union all 
     select 4 tmp from dual 
     union all 
     select 5 tmp from dual 
     union all 
     select 6 tmp from dual 
     union all 
     select 7 tmp from dual 
)) AS number