오늘 회사에서 동기가 function을 수정하는데 IF ~ ELSE문 조건이 이상하게 걸린다고 했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
CREATE OR REPLACE FUNCTION 함수명 (
arg1 IN VARCHAR2, arg2 IN VARCHAR2, arg3 IN VARCHAR2 DEFAULT NULL
)
~~
IF arg3 IS NOT NULL AND arg3 <> '' THEN
select * from A;
ELSE
select * from B;
END IF;
~~
|
cs |
대강 이런 형태의 쿼리였는데 arg3이라는 변수에 특정문자가 있는 경우에는 A테이블을 읽고,
arg3 값이 없거나 공백일 때는 B테이블을 읽게 하고 싶었다.
arg3에 'TEST' 라는 특정 문자를 넘겼을 때,
당연하게도 첫번째 조건에 걸려서 A테이블을 읽어올 것이라고 생각했는데
결과는 ELSE를 타서 B테이블을 읽었다.
아무리 생각해도 이상해서 이것저것 동기와 같이 찾아보았는데
오라클에서는 빈 문자열은 NULL 취급된다는 결론을 찾았다.
IF 조건의 AND 뒤 구문이 잘못되었고 해당 부분을 지우고 IS NOT NULL 만 조건에 남겨두니 정상적으로 작동되었다.
아래의 포스팅에서 도움을 받을 수 있었다.
https://debtandshadow.tistory.com/416
'SQL' 카테고리의 다른 글
[REGEXP] MySQL, MariaDB - LIKE, IN 동시에 쓰는 방법 (0) | 2022.03.06 |
---|---|
Oracle과 MySQL 문법 차이 (0) | 2021.11.13 |