WHERE절 1=1, 1=2의 의미

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의 을 이용해 파라미터가 특정값이면 조건을 추가시키는 동적쿼리이다. 파라미터의 값이 특정값과 일치하면 where조건이 추가되고 조건이 모두 맞지않으면 전체를 조회하는 쿼리문이다.



만약 여기서 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

+ Recent posts