ora-01722 invalid number 문제 0 3 5,240

by lover [SQL Query] [2014.10.27 16:38:32]


 

아래 쿼리를 돌리니 ora-01722 invalid number가 뜨네요.

case에 있는 sum(amount) 때문인 것 같습니다.

컬럼은 varchar2 로 되어 있으며, 실제 값은 금액에 해당하는 값이 들어오는데

천원 --> 1000

-1000원 -->  1000-    의 형태로 들어옵니다.

금액 amount 외에 다른 컬럼으로 grouping 하면서, 금액은 sum을 해야하는데

저렇게 뜨네요..  컬럼에 제일 우측에 - 가 있어서 저렇게 쿼리를 했는데 방법이 없을까요?

 

 

 

select

    crtdate,  duedate,  name1,  materialgrpdesc, case
      when substr(amount,-1) = '-'  then sum('-'||substr(amount,1,length(amount)-1))
      when substr(amount,-1) <> '-' then  sum(amount)
      end  ,
      currency,  lastname               
from IFIN_FI_DUELIST
group by crtdate,  duedate,  name1,  materialgrpdesc,  currency,  lastname

 

 

 

by 빈이 [2014.10.27 17:31:24]

to_number(       sum('-'||substr(amount,1,length(amount)-1))      )

sum(to_number(amount))

 

to_number로 감싸주세요


by 뉴초보 [2014.10.27 18:32:20]

혹시 몰라서 DECODE 문도 투척해 드립니다~

 

WITH TB_SAMPLE AS (
SELECT	'A' AS SAMPLE_TYPE,
		'1000' AS SAMPLE_NUMBER
FROM DUAL
UNION ALL
SELECT	'A' AS SAMPLE_TYPE,
		'1000-' AS SAMPLE_NUMBER
FROM DUAL
)
SELECT	SAMPLE_TYPE,
		SUM(
        	DECODE(
            	SUBSTR(SAMPLE_NUMBER, -1), '-',
                	TO_NUMBER('-'||SUBSTR(SAMPLE_NUMBER, 1, LENGTH(SAMPLE_NUMBER) -1)),
                    TO_NUMBER(SAMPLE_NUMBER)
                  )
           )
FROM	TB_SAMPLE
GROUP BY SAMPLE_TYPE

 

오라클이 똑똑해서 형변환(문자->숫자)을 알아서 해주긴 하지만....

기왕이면 TO_NUMBER 사용을 추천 합니다.


by 마농 [2014.10.28 09:12:45]

SUM(REGEXP_REPLACE(amount, '([0-9]+)(-?)', '\2\1'))

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입