postgreSql 쿼리 질문하겠습니다 0 6 7,410

by 겸둥이k [SQL Query] 쿼리 자료형 [2019.04.18 09:25:39]


SELECT '평균' juso, ROUND (AVG (REPLACE (ANG_N, '-', '')::numeric), 0)::varchar AS angN,          
                        ROUND (AVG (REPLACE (POL, '-', '')::numeric), 2)::varchar AS pol,         
                         ROUND (AVG (REPLACE (POL_M, '-', '')::numeric), 2)::varchar AS polM,          
                         ROUND (AVG (REPLACE (DR_I, '-', '')::numeric), 2)::varchar AS drI,         
                          ROUND (AVG (REPLACE (POL_B, '-', '')::numeric), 2)::varchar AS polB,       
                           '' createDate      FROM         gis1.TEST A    
                             WHERE         1=1                                
                                             
                

종류는 포스트그릴인데 에러가    

numeric 자료형 대한 잘못된 입력: ""

SQL state: 22P02

이렇게뜨는데  gis1.TEST A 있는 컬럼들 모두  varchar인데  에러이유가 혹시 데이터문제일까요? 빈값인데이터가 있어서그럴까요?

아님 ::numeric 선언된 위치가 잘못되었나요? 

답변부탁드립니다~

 

다시해본결과 컬럼  pol polM주석처리하면 잘 돌아갑니다. 뭐때문에그럴까요?

by 마농 [2019.04.18 14:51:14]

숫자로 변경 불가능한 문자가 들어 있겠네요.


by 겸둥이k [2019.04.18 16:31:12]

답변감사드립니다

데이터확인해보니까

postSql은 null 이 있는상태에서 avg 함수같은걸쓰니까 에러가 나더라구요 데이터를 다 채우면 에러가 안나구요 

오라클은 그냥 null 있어도 다알아서 계산하는데 

postgreSql은 올래 그런가요?


by 마농 [2019.04.18 16:42:35]

NULL 이 있어서 에러나는게 아니라.
'' 이 있어서 에러나는게 아닐까요?


by 겸둥이k [2019.04.18 17:03:23]

데이터에서 update  gis1.TEST_TOTAL set POL='0'(각컬럼) WHERE POL =''  업데이트하고 다시 검색해보면 괜찮더라구요 

저기서 조건에서 POL ='' 이렇게해서 됐다는것은 null 문제가아니라 다 빈값문제라는건데 그럼 처리를 어떻게 하면될까요 ㅠ 데이터 변경안하고 

REPLACE (ANG_N, '', 0)  리플레이스를 해도 똑같은에러나더라구요 ㅠ  


by 마농 [2019.04.18 17:16:26]

NULL 과 '' 은 다릅니다.
AVG 할 때 NULL 은 계산에서 제외됩니다.
그러니 '' 을 NULL 로 바꿀지? 0 으로 바꿀지? 신중하게 판단해야 합니다.
결과가 달라집니다.
예) ('2', '4', '') 을 평균 낼 때
1. 0으로 치환하는 경우 : AVG(2, 4, 0) = (2+4+0)/3 = 2
2. null로 치환하는 경우 : AVG(2, 4, null) = (2+4)/2 = 3

그리고 리플레이스 '-' 을 하는 이유는 뭔가요?


by 겸둥이k [2019.04.18 17:37:26]

아마 예전데이터쿼리라서 그런거같습니다 예전데이터에는 - 가있엇나봅니다  ,지금은 다 변경했습니다

해결방안을 찾았습니다 방법은 replace 가 빈값을 안먹으니 

case 문으로 ROUND (AVG (CASE WHEN ANG_N= '' THEN '0' ELSE ANG_N END::numeric), 0)::varchar AS angN,   쓰니 되더라구요 

근데왜 replace는 안되는지 참 ;;

답변감사드립니다

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