검색시 Data Type 관련 문의 드립니다. 0 6 727

by 레알 [SQL Query] [2016.01.28 22:18:40]


프로시저를 만들다 이상한 점을 발견해서 문의 드립니다.

인자값은 number 와 varchar2 로 받고 아래와 같은 쿼리로 조회를 합니다.

T_ID IN NUMBER, T_RSLT_CD VARCHAR2 -- 인자값

 

SELECT *  FROM TBL
 WHERE T_ID = 2016012201 -- NUMBER
   AND T_RSLT_CD = '050' -- VARCHAR2 

이렇게 하면 조회가 되는데
T_RSLT_CD 값을 부정조건으로( T_RSLT_CD != '050',  T_RSLT_CD <> '050' )
변경하면 조회가 안됩니다.
이런경우는 처음이라 좀 당황스러운데 부정조건으로 조회할수 있는 해결방법이 없을까여?


   

by jkson [2016.01.29 08:07:20]

프로시저 안에서 사용한 쿼리인가요?

아무래도 어떠한 변수에 담으려고 하셨던 것 같은데..

혹시 t_rslt_cd = '050'에 만족하는 데이터는 1개이고

t_rslt_cd != '050'에 만족하는 데이터는 여러개인 것 아닌가요?


by swlee710 [2016.01.29 11:19:02]

부정형 조건에 해당하는 데이터가 없는거 아닌가요?

 

by 마농 [2016.01.29 11:31:52]

변수 사용하는 부분이 안보이네요?

혹시 질문하면서 변수부분을 상수로 바꾸어 질문 한거라면???

사용하신 쿼리에서 보면 컬럼명과 변수명이 동일합니다.

t_rslt_cd = t_rslt_cd

좌변은 컬럼명 우변은 변수라고 생각하고 사용한거겠지만

컴퓨터는 이를 구별 못합니다. 둘다 컬럼으로 인식합니다.

변수명을 컬럼명과 다르게 선언해서 사용해 주세요. v_t_rslt_cd
 


by 레알 [2016.01.29 14:43:21]

급해서 내용을 부실하게 적었네여;;

일단 데이터들은 아래와 같은 형태로 들어가 있습니다.

WITH T AS (
     SELECT  20160129 AS T_ID,  '050' AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  ''    AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  '010' AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  '020' AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  '030' AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  ''    AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL UNION ALL
     SELECT  20160129 AS T_ID,  ''    AS T_RSLT_CD, 'JM' AS T_CD FROM DUAL
)
SELECT T_ID, T_RSLT_CD FROM T 
 WHERE T_ID = 20160129
   AND T_RSLT_CD != '050'
   AND T_CD ='JM'

T_RSLT_CD 값이 050 아닌것들을 구하고 싶은데 T_RSLT_CD 값들이 NULL 이면 조회가 안되고 값이 있으면 조회가 되는상황인데 도통 모르겠네여;;


by 마농 [2016.01.29 14:53:56]

Null 은 좀 특수한 값인데요. Null 의 특성을 잘 이해하고 사용해야 합니다.

Null 은 비교 자체가 불가하므로 비교식에 사용시 결과는 항상 거짓이 됩니다.

NVL(t_rslt_cd, 'x') != '050'


by 겸댕2후니 [2016.01.29 17:20:45]

마농님 말씀대로, null과 비교는 항상 거짓이 됩니다.

 T_RSLT_CD = '050'        T_RSLT_CD != '050'

위의 두 문장 다 NULL값인 로우를 검색할 순 없습니다.

NULL값과 조건에 만족되는 로우를 모두 검색하려면,

마농님이 적어주신 NVL처리를 하시는 것이 제일 좋습니다.

또는,

T_RSLT_CD != '050' or T_RSLT_CD is null

로도 가능합니다(성능상 사용할 이유가 없지만)

 

 

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