2010-09-25 27 views
4

我的理解是GREATEST()和LEAST()不是SQL标准的一部分,但是很常见。SQL标准中最高和最低标准

我在想,有没有办法克隆GREATEST的功能保持在SQL标准内?

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

完全查询:

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

什么数据库? GREATEST&LEAST由[PostgreSQL](http://www.postgresql.org/docs/8.1/interactive/functions-conditional.html),[MySQL](http://dev.mysql.com/doc/refman /4.1/en/comparison-operators.html#function_greatest),[Oracle](http://techonthenet.com/oracle/functions/greatest.php)。 SQL Server是唯一不支持GREATEST/LEAST的专业。 – 2010-09-25 17:58:40

+1

我知道PostgreSQL和MySQL支持GREATEST/LEAST。我的问题涉及实际的SQL标准http://en.wikipedia.org/wiki/SQL#Standardization – WalterJ89 2010-09-25 22:35:51

+0

另请参阅:http://stackoverflow.com/questions/71022/sql-max-of-multiple-columns – 2012-05-23 12:07:02

回答

3

可以使用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,谢谢。 – WalterJ89 2010-09-25 16:14:18

+3

这不会很好地扩展到两个以上的值。这对于OP的具体例子来说很好,但并没有回答更一般的问题。 – 2012-04-24 08:49:31

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

可以成为

(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