2012-01-12 8 views
1

私はさまざまな長さの番号の列を持っています、そして、それらがすべて最大の長さになるようにそれらをゼロで埋めたいと思います。これと同じように:LPADその列のMAX LENGTHの列

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バリアを転がしたとき)に、これらの数字のすべてが再フォーマットされますか?通常、このようなパディングは、安定した識別子を作成しようとするときに適用されます。 –

+0

私は@Damienに同意します - これを行う必要がある場合は、データベース側ではなくUI側で行う必要があります。 – MJB

+0

私はそれを念頭に置いておきます、ありがとう。しかし、今のところ、私はそれをする必要はありません、私は知りたがっていました。 – jalopezp

答えて

5

あなたはおそらく二つのステップでそれを行うのがベスト

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

これは、max(...)の外でover()を動かすと機能します: 'MAX(LENGTH(PROD_ID))OVER()、 ' –

+0

@JohnDoyle - Fixed。よく目撃された。 –

+0

@jalopezp - 間違った場所にかっこが残っているように見えます。私は答えを決めた。 –

0

をしようとした場合、私はこの自分自身をテストすることができないんですが、何。 1つのクエリで最大長を最初に選択し、次に実際のデータを選択する2番目のクエリを実行します。結合でそれを行うことは可能ですが、おそらくパフォーマンスが悪いでしょう。