sql 쿼리 문의드립니다...
본문
select * from g5_write_free where wr_option NOT IN ('secret') 이렇게 쿼리를 날리면
옵션값이 html1,secret 인 경우 검색이 되는데요..
검색이 안되어야 정상아닌가요???
옮션값에 secret 이거 하나만 있으면 검색이 안되는데 위에 처럼 html1,secret 있으면 검색이되어버리네요
제가 뭘 잘못알고 있는건지 아니면 다른부부닝 잘못된건지....
답변 4
wr_option NOT IN ('secret') <==> wr_option !='secret' 동일합니다
wr_option 값이 "html1,secret" 이면 당연히 wr_option !='secret' 인 거죠
참고로
wr_option ='secret' or wr_option ='html' 이것을 간단히 한 형태가 wr_option IN ('secret', 'html')
wr_option NOT IN ('secret', 'html') ==> wr_option !='secret' and wr_option !='html'
질문의 경우 다음처럼 해도 됩니다
not INSTR('wr_option', 'secret')
select * from g5_write_free where wr_option not like '%secret%'
NOT IN ('secret') 이 문법이 잘못되진 않았습니다.
다만, 현재 사용하실려는 상황에서는 적절치 않을 뿐입니다.
해석하자면, 단일 문자열 + 정확하게 일치 해야만 합니다.
문제는 실제 데이터가 저장되는 WR_OPTION에서는 html1,secret 해서 , 콤마 형태로 저장되기 때문에
필터링이 되지 않아 전체가 다 나오는 것입니다.
즉 문법 오류가 아니라, 사용하고자 하는 상황에서는 맞지 않는 문법이라 보시면 됩니다.
, 콤마가 있을 땐 find_in_set() 함수를 이용해보는 것도 좋을 듯 합니다.
SELECT *
FROM g5_write_free
WHERE FIND_IN_SET('secret', wr_option) = 0;
!-->
html1 이 포함되어 있기 때문에 검색이 되는 겁니다. NOT IN ('secret') 로 검색을 할 경우
정확히 'secret' 만 제외가 되기 때문이예요.