PostgreSQL 형변환 문의 0 12 6,034

by 임태원 [2017.02.13 10:00:41]


20170213_100029.png (4,247Bytes)

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        ' 찍혀있습니다.

 

 

 

by jkson [2017.02.13 10:18:06]

값이 없으면 0인 거죠?? postgreSQL에서는 coalesce(price,0) 이렇게 하면 되는 것 같네요.


by 임태원 [2017.02.13 10:20:46]

Coalesce 함수와 공백제거Ltrim 대체Replace 이것저것 해 보았으나,, 마찬가지로 위와같은 결과값이 나옵니다.ㅠ

 


by 임태원 [2017.02.13 10:22:51]

coalesce(replace(ltrim(STSE101_DWTS371.MARKET_SDP_PRICE),' ',''),'0')


by jkson [2017.02.13 10:24:56]

postgreSQL에서 null과 ''가 같은 의미인지 모르겠네요. coalesce(replace(STSE101_DWTS371.MARKET_SDP_PRICE,' ',null),'0') 이렇게 해보시죠.


by 임태원 [2017.02.13 10:26:41]

우악. 감사합니다. ''와 'null'과 무슨 차이였던거죠?

 


by jkson [2017.02.13 10:27:25]

오라클에서는 ''가 null의 의미이지만 다른 dbms에서는 다른 의미인 경우가 많습니다. null은 알 수 없는 값 ''는 길이가 0인 문자값


by 임태원 [2017.02.13 10:54:20]

위와같이 적용하여 널인값이 0으로 찍히는 것은 성공했지만.
실제 25000값이 있는경우에도. 0으로 찍혀버리네요. 이는 Case when 구문을 사용할 수 밖에 없는건가요


by jkson [2017.02.13 11:10:24]

의미를 정확히 알고 테스트해보시면서 진행해보시면 될 것 같습니다.

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은 어떤지 모르겠네요.

 


by 마농 [2017.02.13 11:23:24]

포스그래 없어서 MSSQL 및 MYSQL 에서 테스트 해봤습니다.
REPLACE('123   ', ' ', NULL) 은 NULL 이 나옵니다.
즉, REPLACE 함수를 잘못 사용한 듯 하네요.
MSSQL 및 MYSQL 에서 단순히 +0 이나 *1 을 해보면
자동 형변환 되면서 숫자로 바뀌고 공백은 0 이 나오네요.
한번 시도해 보세요.
SELECT price + 0 AS price


by jkson [2017.02.13 11:38:24]

더 좋은 답변을 달아놓으셨네요.

STSE101_DWTS371.MARKET_SDP_PRICE + 0

이렇게 해보라는 말씀시군요~~


by jkson [2017.02.13 11:33:32]

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')

이렇게 사용해보면 어떨까요?


by 주킹 [2017.02.13 18:31:53]

select coalesce(case rtrim(STSE101_DWTS371.MARKET_SDP_PRICE) when '' then null

else rtrim(price) end, '0') from table;

이렇게 하면 어떨까여

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