여러 컬럼중 원하는 데이터가 존재하는지 확인시 0 6 4,386

by 이광영 [MySQL] [2015.03.22 17:51:22]


약 100개의 integer 타입 컬럼을 가진 테이블이 있습니다.

이 100개의 컬럼 중 특정 숫자를 가진 row만 select가 하고 싶은 경우 어떤식으로 쿼리를 작성해야 하나요?

하나의 컬럼에 여러 숫자중 하나가 있는지 확인할 경우

select * from table where number in (1,2,3,4);

이런식으로 하면 되겠지만

반대의 경우는 해본적이 없었네요.

by jkson [2015.03.22 23:18:13]

너무 어렵게 생각하시는 거 아닌지..

가장 기초적인 방법이

SELECT * FROM TABLE WHERE COL1 = :VALUE OR COL2 = :VALUE OR COL3 = :VALUE....

이런 방법일테죠.

 

참고로.. 저도 얼마전에 배운 내용입니다만

특정 테이블 숫자형 컬럼에 특정 데이터가 존재하느냐의 여부는

 

 SELECT NVL (wm_concat (column_name), 'no data found')
     FROM (SELECT column_name
             FROM all_tab_columns
            WHERE table_name = UPPER (:in_tablenm)
              AND TO_NUMBER (DBMS_XMLGEN.getxmltype ( 'select 1 from '
                                                       || table_name
                                                       || ' where '
                                                       || column_name
                                                       || ' like '''
                                                       || :in_val
                                                       || ''' and rownum = 1'
                                                      ).EXTRACT ('//text()')
                              ) = 1
              AND DATA_TYPE = 'NUMBER'
           ORDER BY column_name);

 

이렇게 확인해보실 수 있어요.

해당 값을 가진 컬럼이 모두 나옵니다.

다시 해당 컬럼들로 조회해보시면 어떤 ROW가 그 값을 가지고 있는지 알 수 있구요.

다만 테이블 사이즈가 클 경우 FULL서칭이라 서버에 부담이 될 수 있어요.

어떻게 잘 변형하면 ROW까지 한방에 나오게 할 수 있을 것 같긴하네요.

 

그냥 정석으로 OR 사용하시는 게 좋을 것 같습니다.


by 마농 [2015.03.23 08:46:52]
-- "컬럼은 왼쪽, 비교값은 오른쪽" 이라는 고정관념을 버리세요.
 WHERE :비교값 IN (컬럼1, 컬럼2, ..., 컬럼100)

 


by 이런잭쓴 [2015.03.23 15:26:23]

헉 정말 고정관념속에 살아왔네요...

좋은정보 감사드립니다.저도 필요로하던 내용이였는데 ~! 


by 겸댕2후니 [2015.03.23 18:04:31]

이런방법도 있네요... 생각도 못했었어요^^;


by 이광영 [2015.03.23 19:06:02]

감사합니다. 간단한 방법이 있었군요


by jkson [2015.03.23 22:49:16]

우헉! 이 생각을 왜 못 했죠?ㅋ

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