2017-09-04 5 views
0

の列を変換する必要があります。VARCHAR2からNUMBERに変換します。Oracle SQL:Varchar2をNumberに変換してNullを処理する

SELECT V_PDAYPROD_CRW1.MFGCELL  , 
    V_PDAYPROD_CRW1.MFG_TYPE  , 
    V_PDAYPROD_CRW1.PROD_DATE, 
    V_PDAYPROD_CRW1.EQNO, 
    V_PDAYPROD_CRW1.SHIFT, 
    V_PDAYPROD_CRW1.ARINVT_ID, 
    NVL(AVG(
    TO_NUMBER(NVL(V_PDAYPROD_CRW1.CUSER1,0),9999.99) 
    ),0) CUSER1  

FROM V_PDAYPROD_CRW1 
    LEFT JOIN 
    (
     SELECT REJECTS.DAY_PART_ID D_P_ID, 
     SUM(REJECTS.REJECTS) RE 
     FROM REJECTS 
     GROUP BY REJECTS.DAY_PART_ID 
    ) 
     ON V_PDAYPROD_CRW1.PDAY_PART_ID = D_P_ID 


GROUP BY V_PDAYPROD_CRW1.MFGCELL  , 
     V_PDAYPROD_CRW1.MFG_TYPE  , 
     V_PDAYPROD_CRW1.PROD_DATE, 
     V_PDAYPROD_CRW1.EQNO, 
     V_PDAYPROD_CRW1.SHIFT, 
     V_PDAYPROD_CRW1.ARINVT_ID 

私はエラーORA-01722: invalid numberを取得しておいてください。以下は、私は彼が仕事を得ることができるかどうかを確認するために使用しています現在のSQLです。 CUSER1の値は、ほとんどがNULL、5、0.33、0.25、1、0.1、0.42などです。

これを行うにはTO_NUMBER()を使用しようとしていますが、 。

提案がありますか?

更新VARCHAR2をNUMBERにキャストしようとしました。私は

COALESCE(TO_NUMBER(REGEXP_SUBSTR(V_PDAYPROD_CRW1.CUSER1, '^\d+')), 0) 

これは私に結果を取得している:それは私はそれが動作を取得するには、次のように使用しています

作業ガット:それでもINVALID NUMBER

SELECT V_PDAYPROD_CRW1.MFGCELL  , 
    V_PDAYPROD_CRW1.MFG_TYPE  , 
    V_PDAYPROD_CRW1.PROD_DATE, 
    V_PDAYPROD_CRW1.EQNO, 
    V_PDAYPROD_CRW1.SHIFT, 
    V_PDAYPROD_CRW1.ARINVT_ID, 

    NVL(AVG(CAST(V_PDAYPROD_CRW1.CUSER1 AS NUMBER)),0) CUSER1   

FROM V_PDAYPROD_CRW1 
    LEFT JOIN 
    (
     SELECT REJECTS.DAY_PART_ID D_P_ID, 
     SUM(REJECTS.REJECTS) RE 
     FROM REJECTS 
     GROUP BY REJECTS.DAY_PART_ID 
    ) 
     ON V_PDAYPROD_CRW1.PDAY_PART_ID = D_P_ID 

GROUP BY V_PDAYPROD_CRW1.MFGCELL  , 
     V_PDAYPROD_CRW1.MFG_TYPE  , 
     V_PDAYPROD_CRW1.PROD_DATE, 
     V_PDAYPROD_CRW1.EQNO, 
     V_PDAYPROD_CRW1.SHIFT, 
     V_PDAYPROD_CRW1.ARINVT_ID 

が更新取得欲しいです。私に適切なソリューションを導いてくれてありがとう@Thorsten_Kettner。

+1

ここではどういう意味ですか? – jarlh

+0

申し訳ありません。私は値がNULLで、10進数(5)、2の小数点(0.33)、先行ゼロのない2小数点(.25)などの異なるフォーマットであることを説明しようとしています。 – spyr0

+0

'AVG(NVL(V_PDAYPROD_CRW1.CUSER1,0))'を試してください。十分なはずです。 – g00dy

答えて

1

変換がポイントで失敗することがあります。 0.33はすべての言語で有効な数字ではありません。

あなたは明示的に小数点としてポイントを指定することができます。

to_number(cuser1, '99999.999') 

そしておそらくあなたも、空白トリミングする必要があると思います:

to_number(trim(cuser1), '99999.999') 

をしかし、まだパターンに違反する値があるかもしれません。次に、WHERE句を使用すると、有効な数値のみを変換することができます。例:

where regexp_like(cuser1, '^[[:digit:]]*\.{0,1}[[:digit:]]*$') or cuser1 is null 
+0

ありがとう!この – spyr0

0
NVL(AVG(
TO_NUMBER(NVL(V_PDAYPROD_CRW1.CUSER1,'0'),'9999.99') 
),0) CUSER1 

はこれを試してください。..

+0

ご回答いただきありがとうございますが、残念ながら動作しません。私は現時点で「と」を無視している場合があります。 – spyr0

+1

to_numberの代わりにキャストを試してみましたか? –

+0

今すぐ試してみます – spyr0

関連する問題