select
length(PRICE)
,PRICE
,replace(PRICE),'','0')
from table
프라이스의 길이는 9입니다.
프라이스는 Varchar형 칼럼이며 숫자가 찍혀있는경우와 빈칸인 경우가 있습니다.
아무것도 안찍힌 경우도 0을 찍어서 to_number로 숫자형식으로 변환하고 싶습니다.
Case When을 사용하면 됩니다.
하지만 to_number을 사용해서 숫자로 바꾸고 싶습니다. 고수님들의 도움을 부탁드립니다.
Case When을 사용하면 안되는 이유는. 칼럼 길이가 9,10,11,12 다양해서 일일이 바꾸기가 어렵습니다.
ex 36번줄에 0을 찍고 싶어요..
저 빈칸에 실제값은 ' '으로 찍혀있고, 0의 실제값은 '0 ' 찍혀있습니다.
의미를 정확히 알고 테스트해보시면서 진행해보시면 될 것 같습니다.
coalesce함수는 인수로 들어온 값들 중 null이 아닌 첫 번째 값을 반환합니다.
replace는 아실 것 같고..
따라서 coalesce(replace(STSE101_DWTS371.MARKET_SDP_PRICE,' ',null),'0') 는
STSE101_DWTS371.MARKET_SDP_PRICE의 공백란을 전부 null로 바꾼 값이 null 이면 '0'을 리턴해주고
그게 아니면 STSE101_DWTS371.MARKET_SDP_PRICE의 공백란을 전부 null로 바꾼 값을 리턴해줍니다.
실제 25000 값이 들어있다면 25000이 나오겠죠. 뭔가 실수한 게 없는지 확인해보세요.
postgreSQL이 설치되어있지 않아 테스트가 불가하네요. 죄송합니다.
replace(STSE101_DWTS371.MARKET_SDP_PRICE,' ',null) 값이 25000으로 나오는지부터 테스트해보세요.
oracle에서는 ' ' 값을 null로 바꾸면 나머지 문자들이 concat되는데 postgreSQL은 어떤지 모르겠네요.
replace가 오라클하고 기능이 다른가보네요.
oracle에서 문자열 || null 값은 문자열이 되고
concat(문자열,null) 값도 문자열인데 sql 서버쪽에서 테스트해보니 null이네요.(concat은 문자열 나오네요. 기준이..;)
의미상으로는 오라클이 틀린 것 같네요. 알 수 없는 값과 특정문자열을 합치면 알 수 없는 값이 나와야 정확한 거니깐..
좀 복잡하긴하지만 그럼
coalesce(case when replace(STSE101_DWTS371.MARKET_SDP_PRICE,' ','') = '' then null else replace(STSE101_DWTS371.MARKET_SDP_PRICE,' ','') end,'0')
이렇게 사용해보면 어떨까요?