반응형
SQL 쿼리문을 짤 때, WHERE 1=1 및 1=2를 사용하는 이유는 쿼리문에서 조건문을 걸 때 편리하게 사용하기 위함입니다. 아래의 분류로 좀 더 깊게 봅시다.
WHERE 1=1
WHERE 1=1에서 1=1은 TRUE입니다. 그래서, 쿼리문을 짤 때 무조건 WHERE은 TRUE이기 때문에 조건절이 돕니다. 아래의 예시 쿼리를 봅시다.
SELECT *
FROM TEST
WHERE
<if test="A != null and A != ''">
AND A = 1
</if>
위의 쿼리에서 A가 null이 아니고, 빈 값이 아니면 A는 1이 됩니다. 즉, A가 null이 아니고, 빈 값이 아니면 정상적으로 쿼리가 작동합니다. 근데, A가 null이거나 A가 빈값이라면 AND A = 1 이 쿼리문은 없어집니다. 그렇게 되면, 아래의 쿼리문처럼 되어 에러가 발생합니다.
SELECT *
FROM TEST
WHERE
그래서, 사용하는 것이 바로 WHERE 1=1입니다.
WHERE 1=1을 사용하게 되면 위의 쿼리를 다시 실행했을 때, 아래의 쿼리는 이렇게 남습니다.
SELECT *
FROM TEST
WHERE 1=1
위의 쿼리를 실행하게 되면, 결국엔 테이블 전체 테이터를 SELECT하게 되는 것과 똑같습니다.
WHERE 1=2
WEHRE 1=2에서 1=2는 false입니다. 그래서, 쿼리문을 1=2로 짜게 되면, 돌지 않습니다.
SELECT *
FROM TEST
WHERE
<if test="A != null and A != ''">
AND A = 1
</if>
위의 쿼리문에서 WHERE을 WHERE 1=2로 바꿔봅시다.
SELECT *
FROM TEST
WHERE 1=2
<if test="A != null and A != ''">
AND A = 1
</if>
그러면, WHERE 절에 의해 아무런 결과를 받아올 수 없습니다.
이 WHERE 1=1과 1=2는 적절한 상황에서만 써야 합니다. 무작정 1=1을 쓸 경우에는 입력값을 잘못 입력해도 결과를 리턴하는 경우가 발생하므로, 정확한 로직에서만 사용해야 합니다.
반응형
'IT > DB' 카테고리의 다른 글
[DB] PLS-00201: 'DBMS_CRYPTO' 식별자가 정의되어야 합니다 문제 해결 방법 (0) | 2022.10.06 |
---|---|
[DB] Function 및 프로시저 추출 스크립트 PL/SQL로 생성하는 방법 (0) | 2022.10.05 |
티베로(Tibero) 엑셀파일 업로드 하는 방법(expImp 사용 X, Tibero Studio 2) (0) | 2022.04.07 |
엑셀(Excel)에서 2개 이상의 열을 기준으로 중복값 찾기 (0) | 2022.04.07 |
데이터베이스(DB) JOIN(INNER JOIN / LEFT JOIN / RIGHT JOIN / OUTER JOIN) 정리 (0) | 2021.10.25 |
데이터베이스(DB) 서브쿼리(SubQuery) 정리 (1) | 2021.04.06 |
데이터베이스(DB) JOIN 정리 (0) | 2021.04.06 |
MySQL 데이터베이스 정리 (0) | 2021.04.06 |
최근댓글