2017-09-04 1 views
0

열을 변환해야합니다. VARCHAR2에서 NUMBER으로 연결됩니다. 아래는 내가 얻을 수 있는지 확인하기 위해 사용하고있는 현재의 SQL은 자신의 일을합니다 : I 오류 ORA-01722: invalid number가 계속Oracle SQL : Varchar2를 숫자로 변환하고 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 

. CUSER1의 값은 주로 다음과 같습니다. NULL, 5, 0.33, .25, 1, .1, 0.42 등 ...

TO_NUMBER()을 사용하려고하지만 올바르게 처리 할 수 ​​없습니다. .

제안 사항?

업데이트 VARCHAR2를 NUMBER로 캐스팅했습니다. 여전히 INVALID 번호

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 

업데이트

를 받고 : 그것은

작업 당함 나는이 작업을 얻을 다음 사용하고 있습니다 :

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

이 나에게 결과 I을 받고있다 필요. 저에게 올바른 해결책을 안내해 주신 Mr.Thorsten_Kettner에게 감사드립니다.

+1

여기서 가장 의미가있는 것은 무엇입니까? – jarlh

+0

죄송합니다. 나는 값들이 NULLs이고 10 진수가 아닌 (5), 2 진수 (0.33), 선행 제로 (.25)가없는 2 진수 등등에 대해 설명하려고 노력하고있다. – 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

관련 문제