-
SQL 쿼리문에서 WHERE 1=1을 사용하는 이유study/DB 2020. 12. 24. 00:13반응형
개발을 하거나 다른 코드를 보고 있으면, 쿼리문에서 WHERE 1=1 처럼 작성된 것을 볼 수가 있을 것이다.
SELECT column_1, column_2, ... coulmnN FROM your_table WHERE 1=1 AND your_condition="something" ...
사실 1=1 은 무조건 true 이기 때문에 이 조건은 매우 쓸데없는 것처럼 보인다. 물론 2=2 또는 100=100 따위를 써도 코드는 그대로 작동한다.
이렇게 조건을 주는것은 동적 쿼리를 만들때이다. 수많은 쿼리를 만들다 보면 첫번째 조건에 어떤 것이 올지 몰라서 젤 먼저 1=1 같은 무의미한 조건을 걸어두고, 이후에 AND로 조건들을 쭉 붙이기 위해 사용하는 것이다.
이렇게 쓰지 않으면 쿼리마다 형태가 다르게 될 수있다. 예를 들어,
WHERE condition1 = "something" AND condition2 > "something2" AND ... AND ...
또한 복잡한 조건문이 여러개일 경우 일단 결과값을 조회할때 어디서 걸러지는지 조회할 때에도 편하다.(디버깅)
보통은 List를 뽑아오거나 Select를 할때 활용하는데, 성능에도 저하가 없기 때문에 사용할 때 부담은 없다.
결국은 편의성을 위해 사용하는 것이며, update, delete같은 처리를 할때에는 null값 체크를 잘 해야줘야 한다.(이건 WHERE 1=1을 쓰나 안쓰나 마찬가지로 중요하긴 하다.)
mybatis의 <where>문을 통해 1=1을 안쓰고도 동적 쿼리를 편하게 작성할 수 있다고 한다. 이부분에 대해서도 공부해봐야겠다.
+++++++++++++++++++++++++++++++++++++++++
<select id="findActiveBlogLike" resultType="Blog"> SELECT * FROM BLOG <where> <if test="state != null"> state = #{state} </if> <if test="title != null"> AND title like #{title} </if> <if test="author != null and author.name != null"> AND author_name like #{author.name} </if> </where> </select>
mybatis 에서는 위와 같이 <where>을 사용할 수 있다.
또한 <if> 조건으로 null 체크를 할 수도 있어서 동적 SQL을 만들기에 간편하다.
또 동적으로 세팅된 쿼리에서 where 이후에 처음으로 오는 조건에는 AND나 OR을 생략해주기 때문에 실제로 조건을 추가할 때는
<if test="something != null"> AND SOME_THING = #{something} </if>
위의 <if>문 처럼 쭉쭉 붙여나가면 된다.
Reference :
stackoverflow.com/questions/242822/why-would-someone-use-where-1-1-and-conditions-in-a-sql-clausehttps://mybatis.org/mybatis-3/ko/dynamic-sql.html
반응형'study > DB' 카테고리의 다른 글
SQLP 준비 (0) 2022.12.31 MySQL, MyBatis foreach문으로 여러건의 데이터 처리 (List) (0) 2022.04.05 DB 쿼리 명령어 공부 1 (0) 2020.12.02 SQL injection (0) 2020.09.25