[공통 SQL] WHERE 1=1

2021. 3. 2. 14:01
728x90

WHERE 1=1


 

Chapter 1. WHERE 1=1이 뭐야??

우선, WHERE는 조회하려는 데이터들의 조건을 거는 문법이에요.

1 = 1은 말그대로 을 의미해요.

 

그럼 위 쿼리를 아래와 같이 바꿀 수 있죠.

 

해석해보면,

CUSTOMERID가 '3'인 데이터들을 모두(참) 조회한다.

 

즉, 1=1이란 조건은 있으나마나 한 조건이라는 의미죠.

 


 

Chapter2. 그렇다면 왜 WHERE 1=1절을 쓸까?

 

① 쿼리 디버깅 시, 주석처리가 편하다.

 

아래와 같은 쿼리가 있다고 하죠.

 

 

저는 COMPANYNAME LIKE 'L%'인 데이터가 잘 조회되는지 확인하기 위해

CUSTOMERID = '3'인 조건행을 잠시 주석처리하고 싶어요.

 

그럼 아래와 같이 처리하겠죠.

 

 

 

흠.. 저는 주석을 두번이나 달아야해서 좀 귀찮네요.

여기서 WHERE 1=1을 사용하면 비교적 쉽게 주석처리하면서 디버깅을 할 수 있어요.

 

 

② 동적쿼리에서 특정상황마다 WHERE절을 다르게 작성해줘야 할때 편리하다.

동적쿼리가 궁금하신사람은 아래 더보기 클릭!

더보기

동적쿼리란?

동적쿼리는 조건에 따라서 결과값이 달라지는 쿼리를 의미합니다.

 

대표적으로, 파라미터를 받아서 조건을 거는 경우가 있습니다.

 

위 쿼리는 @CUSTOMER, @COMPANAYNAME의 값에 따라서 SELECT하는 결과값이 달라집니다.

이렇게 SELECT되는 값이 고정되어있지 않고, 바뀔수 있는 쿼리를 동(動)적쿼리라고 합니다.

 

CF. 정적쿼리

동적쿼리와는 반대로 결과값이 고정된 쿼리를 의미합니다. 

 

SELECT * FROM CUSTOMER WHERE CUSTOMERID = '3'

 

위 쿼리는 실행할 때 마다 동일한 결과값을 내겠죠.

이런 쿼리를 정적쿼리라고 합니다. 

 

우선, 특정상황마다 WHERE절을 다르게 작성해야 할때란

흔히 조회조건이 있는 조회기능을 떠올리면 편합니다.

 

예를 들어,

사용자가 CUSTOMERID를 조회조건으로 선택한 후 조회를 할 때는 CUSTOMERID로

COMPANYNAME을 조회조건으로 선택한 경우에는 COMPANYID로 

WHERE절의 조건을 걸어줘야하는 경우이죠.

 

JAVA를 사용해서 소스를 만들어보면 아래와 같습니다.

 

query1 = "SELECT * FROM CUSTOMER "

if(!cusotmerID.equals("") {
	query2 = "WHERE CUSTOMERID = '" + customerID + "'"
}
if(!companyName.equals("") {
	if(!customerId.equals("") {
    	query3 = "AND"
    } else {
    	query3 = "WHERE"
    }
	query4 = "COMPANAYNAME = '" + companayname + "'"
}

 

첫 조건에 WHERE가 붙어야하기 때문에 소스가 복잡해졌습니다.

지금은 조건이 2개밖에 없지만

3개, 4개로 늘어나면 더 복잡해질거에요.

이때, WHERE 1=1을 사용하면 단순한 소스로 수정할 수 있습니다.

query1 = "SELECT * FROM CUSTOMER WHERE 1=1 "

if(!cusotmerID.equals("") {
	query2 = "AND CUSTOMERID = '" + customerID + "'"
}
if(!companyName.equals("") {
	query2 = "AND COMPANYNAME = '" + companyName + "'"
}

 

Chapter 3. Mybatis

<update id="test">
update test_tbl
set use_yn = 'N'
where 1=1
<if test="first != null">
and first = #{first}
</if>
</update>

사실 별 달라질 건 없다. first 값이 null이라면 WHERE 1=1 구문이 되면서 test_tbl 테이블의 모든 use_yn 컬럼 값은 'N'이 될 것이다. 따라서 중요한 것은 WHERE 1=1을 쓰지 말라는 것보다도 '예외 처리'를 확실히 하는 것이 좋겠다.

아니면 아래의 Add Case처럼 처리하는 것이 좋을 것 같다.

위와 같은 MyBatis 문법 말고도 다른 방법으로 where절을 표현할 수 있다. 아래는 최소한으로 변경한 쿼리이다.

<update id="test">
	update test_tbl
	set use_yn = 'N'
	<where>
		<if test="first != null">
			and first = #{first}
		</if>
	</where>
</update>

 

마치며.

이제껏 그냥 당연하게 써왔던 것들을 정리 및 게시 해보려해서 올렸다.
WHERE 1=1은 편리한점도 많지만 위험성도 같이 내포하고 있으니 조심스럽게 이용하는 습관을 기르자. :)

도움받은 글: hyjykelly.tistory.com/5, jdm.kr/blog/7

728x90