예전에 ifnull 함수를 배운 적이 있었습니다. null이면 A로 처리하더라. 이런 플로우였습니다. 반대로, nullif 함수가 있습니다. 이것은 반대로 B이면, null로 처리하게끔 할 때 씁니다. 어떤 플로우인지 잠깐 언급을 드리고, 예제를 간단하게 보겠습니다.

 

 

 먼저, expr1 = expr2가 참이라면, true이니 이 때에는 null을 돌려줍니다. 그렇지 않으면, expr1을 돌려줍니다. 생각보다 복잡하지 않아요. 그러면, 학점 score가 'F'라면 null 처리를 하겠다. 고 하면 어떻게 하면 좋을까요?

 

 

 nullif의 플로우는 위와 같아요. 우리가 리턴해야 하는 값은 score입니다. 그러니, expr1에는 score가 들어가야 합니다. 다음에, expr2에는 'F'가 들어가야 겠네요. 즉, 아래와 같이 작성하시면 됩니다.

 

 

 어렵지 않네요. 순서도만 잘 기억해 두시면 됩니다. 이제 예제를 보도록 하겠습니다.

 

 


 expr1이 'sentence'고, expr2가 'bulk'입니다. 이 둘은 다릅니다. 따라서, 좌항이 리턴이 됩니다.

 

 

 

 결과대로 나옵니다. 반대로, 1번째 인자와 2번째 인자가 같으면 어떨까요?

 

 

 이런 경우는 당연하게도 null이 떨어질 겁니다.

 

 

 예상대로 나오는군요. 2번째 예제를 보겠습니다. 만약에 해당 문자열 str이 'sentence'면 빈 문자열을, 그렇지 않으면 str을 리턴하게 하고 싶습니다. 사실, 제일 좋은 방법은 if 함수를 쓰는 것입니다.

 

 

 

 조건절에 str = 'sentence', 2번째 인자에 '', 3번째 인자에 str을 주면 됩니다. 위 예제는 그냥 'sentence'와 'sentence'가 같으면, 빈 문자열을, 아니라면 'sentence'를 리턴합니다. if 한 줄로 간단하게 끝낼 수 있는데, 아래와 같이 써먹을 수도 있습니다.

 

 

 2번째 줄에서 true가 걸렸으니, nullif에서 null값이 나와버립니다. 그리고 1번째의 ifnull에서 expr1이 null이므로, expr2, 즉 빈 문자열이 리턴이 되어 버립니다.

 

 

 해당 문장의 결과는 위와 같습니다.

 


 화이트 스페이스로만 이루어진 문자열을 null 처리하고 싶습니다. 어떻게 하면 좋을까요? 제일 좋은 방법은, regexp를 이용하는 것입니다. 문서를 보시면, 이것은 target, pat을 각각 1번째, 2번째 인자로 받는다는 것을 알 수 있습니다. 그리고 예제를 보면 3번째 인자로 replacement를 받으면, targex에서 pat이라는 패턴을 만났을 때, replacement로 대체한다는 것을 알 수 있습니다.

 

 white space 하나 이상은 보통 \\s+이니 테스트를 해 봅시다.

 

 

 탭과 공백으로 이루어진 문자열 + a + 탭과 공백으로 이루어진 문자열을 패턴으로 받았습니다. 그리고 하나 이상의 white space가 패턴이고요. 이 패턴을 만나면, 빈 문자열로 치환합니다. 결과적으로 '  a  '는 'a'로 치환될 겁니다. 이것은 빈 문자열이 아니므로 'a'가 리턴이 될 겁니다. 정말 그럴까요?

 

 

 네. 그렇네요.

 

 

 이건 어떨까요? 공백, blank 문자만 있네요. 아예 문자열 전체가 패턴 매칭이 되니, 저것은 빈 문자열로 replace가 될 겁니다. 그리고, 빈 문자열과 빈 문자열은 같으므로 최종적으로 NULL이 나옵니다.

 

 

 예상 대로입니다. 이번 시간에는 nullif 함수에 대해 알아보았습니다. 그리고 중간에 regexp 관련한 것들도 써 보았는데요. 생각보다 유용하게 쓰일 만 하니 이런 게 있다 정도 알아두시면 좋을 듯 싶습니다.