2012-01-12 140 views
1

我有一列不同长度的数字,我想用零填充它们,以使它们都与最大数字一样长。像这样:LPAD列的最大长度

SQL> SELECT LPAD(PROD_ID, 5, 0) AS PROD_ID 
    2 FROM PRODUCTS_TBL; 

PROD_ 
----- 
11235 
00119 
00013 
00015 
00222 
00301 
00302 
00303 
00006 
00087 
00009 
00090 

但我不希望使用5号,我想使用PROD_ID功能,以防后来的变化。我试图

SQL> SELECT LPAD(PROD_ID, MAX(LENGTH(PROD_ID)), 0) 
    2 FROM PRODUCTS_TBL; 

SELECT LPAD(PROD_ID, MAX(LENGTH(PROD_ID)), 0) 
     * 
ERROR at line 1: 
ORA-00937: not a single-group group function 

有什么建议?

+0

有什么意思,在将来某个日子(当你穿过10^n的障碍物时)所有这些数字都会被重新格式化?通常,在尝试创建稳定的标识符时,会应用这样的填充。 – 2012-01-12 11:51:18

+0

我同意@Damien - 似乎如果你有*做到这一点,它应该在UI端完成,而不是在数据库端完成。 – MJB 2012-01-12 12:21:41

+0

我会记住这一点,谢谢。但现在,我不必这样做,我只是想知道。 – jalopezp 2012-01-12 13:12:25

回答

5

我无法将这个测试自己,但如果你尝试

SELECT LPAD(PROD_ID, 
      MAX(LENGTH(PROD_ID)) OVER(), 
      0) 
FROM PRODUCTS_TBL; 
+0

如果你移动max(...):MAX(LENGTH(PROD_ID))OVER(),' – 2012-01-12 11:42:36

+0

@JohnDoyle - Fixed。发现得好。 – 2012-01-12 11:43:23

+0

@jalopezp - 看起来你仍然在错误的地方有括号。我确定了我的答案。 – 2012-01-12 11:49:00

0

可能是最好的做,在两个步骤。在一个查询中首先选择最大长度,然后运行第二个查询来选择实际数据。可以通过加入来完成,但可能表现不佳。