WHERE절 1=1, 1=2의 의미
ibatis를 이용한 동적쿼리를 보면 where절에 1=1, 1=2라는 조건이 자주 보인다.
그전에도 가끔 본 조건이지만 쿼리를 제대로 분석해보고자 마음 먹었기에 1=1과 1=2라는 조건을 자세히 살펴보고자 한다.
WHERE 1=1
SELECT * FROM tb_test WHERE 1=1 <isEqual prepand='AND' property='first' compareValue='1'> first_col = '1' </isEqual> <isEqual prepand='AND' property='second' compareVale='2'> second_col = '2' </isEqual>
ibatis의
만약 여기서 1=1이 없다면?
SELECT * FROM tb_test WHERE
이런 쿼리문이 작성될 것이고, ORA-00936이라는 missing expression 에러가 나게될 것이다.
이렇듯 ibatis를 이용해 WHERE절에 조건을 추가할 때 1=1은 유용할 수 있다.
WHERE 1=2
이번에 WHERE절에 1=2가 어떻게 쓰이는지 살표보자
SELECT * FROM tb_test WHERE 1=1 <isEqual prepand='AND' property='first' compareValue='1'> 1=2 </isEqual> <isEqual prepand='AND' property='second compareValue='2'> second_col = '2' </isEqual>
이 동적쿼리문은 first값이 1로 들어오면
(생략) WHERE 1=1 AND 1=2
이런 조건으로 쿼리문이 실행되면서 false이므로 아무것도 조회하지 못하게 됩니다.
1=2를 이용하면 특정 값을 전달 받을 때, 아무 결과도 가져오지 못하게 할 수 있습니다.
무조건 좋기만 할까?
하지만 이런 1=1을 남발하는 것은 특히 UPDATE, INSERT, DELETE와 같은 데이터의
입출력을 가능케하는 문장에서는 위험할 수 있다.
DELETE FROM tb_test WHERE 1=1 <isEqual prepand='AND' property='first' compareValue='1'> first_col = '1' </isEqual>
이 동적쿼리에 first값이 1로 넘어온다면,
DELETE FROM tb_tes WHERE 1=1
테이블의 모든 데이터가 삭제될 것이다.
그렇기에 1=1, 1=2를 INSERT, DELETE, UPDATE 등에 쓸 때는 한 번 더 생각해보는 것이 중요한 것 같다.
하지만 ibatis말고 mybatis를 쓴다면 <WHERE> 라는 태그를 이용해 동적쿼리가
반환하는 조건이 있다면 첫 번쨰 리턴된 조건의 AND나 OR를 자동으로 trim하여 쿼리문을 동작하게 할 수 있다.
참고 : http://jdm.kr/blog/7
'SQL' 카테고리의 다른 글
JOIN에서 ON절과 WHERE절의 차이 (0) | 2017.08.16 |
---|