비니 왔덩영
오늘도 SQL 쿼리문을 씹고 뜯고 맛보는 중 (즐기지는 못함)
1=1 당연하지 않은가?
그래서 참을 가르키는 듯...
내가 보는 쿼리들에서
SELECT COL1
,COL2
,COL3
FROM TABLE1
WHERE 1=1
AND ID=#ID#
이렇게 생겨먹은 구조를 굉장히 보았다.
솔직히 1=1이 참 조건을 추가해준 것이기 때문에
ID가 부합하는 모든 데이터의 COL1, COL2, COL3을 결과로 준다.
그럼 안 적는 것과 결국은 같다는 것인데 왜 적는지 궁금했다.
하지만 나는 게으르고 호기심보다는 귀찮음이 먼저기에 그냥 썼나봄 하면서 지나갔다가 이제서야 슬쩍 정리를 해본다.
SELECT COL1
,COL2
,COL3
,COL4
FROM TABLE1
WHERE --COL1=#ID#
--AND
COL2=#NAME#
AND COL3=#AGE#
;
위는 1=1을 하지 않을 경우 주석 처리이다
SELECT COL1
,COL2
,COL3
,COL4
FROM TABLE1
WHERE 1=1
--AND COL1=#ID#
AND COL2=#NAME#
AND COL3=#AGE#
;
위는 1=1을 사용할 때의 주석처리이다
누가 봐도 밑에 쿼리문이 깔끔하다는 걸 알 수 있다.
<select id="select">
SELECT
COL1
,COL2
,COL3
,COL4
FROM TABLE
WHERE 1=1
<if test="ID != null and ID= ''">
AND COL1 = #{ID}
AND COL2 = #{NAME}
AND COL3 = #{AGE}
</if>
</select>
UPDATE나 DELETE시 NULL체크를 하지 않고 1=1을 넣은 채로 진행하게 된다면?
<update id="update">
UPDATE TABLE
SET COL2 = #{NAME}
, COL3 = #{AGE}
WHERE 1=1
<if test="ID != null">
AND COL1 = #{ID}
</if>
</update>
위에 업데이트 문에서 만약 ID가 NULL이면 어떻게 될까?
UPDATE TABLE
SET COL2 = #{NAME}
, COL3 = #{AGE}
이 쿼리문을 진행하게 될 것이다.
이러면 모든 인스턴스에 대해서 UPDATE가 일어나는 참사가 벌어지고 만다.
사람은 기계가 아니고 실수할 수 있기 때문에 UPDATE, DELETE에서는 1=1과 같은 참을 넣는 것을 지양해야 한다.