1=1이 들어간 쿼리 이유가 궁금합니다. 0 4 4,661

by 옵티머스 [SQL Query] 1=1 oracle like [2020.05.15 15:22:02]


사내시스템 개발중 기존 쿼리의

where절에 아래와 같은 코드가 있는걸 발견했습니다.

1. WHERE (    (I_NAME IS NULL AND 1=1) 
           OR ( I_NAME IS NOT NULL AND NAME LIKE '%' || I_NAME || '%') )

 

2. WHERE NAME LIKE '%' || I_NAME || '%'

아무리 생각해도 1번 쿼리와 2번 쿼리는  결과나 속도면에서 차이가 없는 것 같습니다

PL/SQL Developer 에서 실행계획을 돌려보면 1번이 cost가 약간 작게 나오긴 합니다.

 

1번과 같이 작성한 이유가 있을까요?

1번과 2번중 어떤걸 쓰는게 좋을까요

 

 

by 생각 [2020.05.15 15:35:55]

1. 가독성을 위해 레거시 시스템에서 자주 쓰였습니다.
2. 동적쿼리문에서 조건이 1개일 때 주로 사용했으나, 이것도 해당 조건이 null일 때 예외처리를 안하면 전체 조회 되는지라 의미가 없습니다.
3. 인덱스를 탄다고는 합니다.

where 10 = 10 을 쓰든 1 = 1을 쓰든 똑같습니다. 가독성을 위한다고 하지만 별 의미 없어 지우는편이 좋습니다.
특히 잘 모르고 DML 구문에서 쓰면 대 참사를 일으킵니다.


by 옵티머스 [2020.05.15 15:50:36]

답변 감사합니다.


by 마농 [2020.05.15 15:38:50]

조건이 입력되지 않을 경우에는 아예 조건 체크를 하지 않으려는 의도입니다.
I_NAME IS NULL 일 경우와 I_NAME IS NOT NULL 일 경우에 조건을 달리 하는 것이지요.

AND 1=1 은 굳이 필요는 없으므로 빼도 상관은 없습니다.
아마도, 아래쪽 쌍을 이루는 조건절과 라임을 맞추기 위해 넣은 게 아닐까? 생각되네요.

위 조건에서는 LIKE '%ㅁㅁㅁ%' 조건이라 성능 차이가 없을 수 있지만
= 조건이나 LIKE 이더라도 앞 쪽 % 가 없는 조건(LIKE 'ㅁㅁㅁ%')이라면 성능차가 있을 수 있습니다.
그리고 name 항목이 null 허용 컬럼이라면? 2번은 틀린 쿼리입니다.

그리고 어떤게 더 나을지는 이 조건 하나만 봐서는 모릅니다.
조건이 이거 하나 뿐인가요? 아니면 다른 조건이 더 있을까요?

양쪽 % LIKE 조건이라면? 그냥 간단하게 2번으로 가는게 좋을 듯 합니다.
= 조건이나 뒤쪽 % LIKE 조건 등의 인덱스를 이용할 수 있는 조건이라면?
다른 조건들과의 우선순위를 따져가며 결정해야 합니다.


by 옵티머스 [2020.05.15 15:50:45]

답변 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입