2012-01-12 145 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

可能是最好的做,在兩個步驟。在一個查詢中首先選擇最大長度,然後運行第二個查詢來選擇實際數據。可以通過加入來完成,但可能表現不佳。