Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

MSSQL

[MSSQL] WHERE 1=1이 뭐야? 왜 쓰는 거야?

Kellyyyy 2019. 10. 12. 15:24

회사에 입사하고 쿼리를 사용하면서

종종 보지만,  잘 이해가 가지 않는 구문이 생겼어요.

 

 

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 + "'"
}