FIELD() 함수와 NULL 처리 방식
MySQL의 FIELD() 함수는 첫 번째 인수로 전달된 검색 문자열이 뒤에 나열된 문자열 목록 중 몇 번째 위치에 있는지를 인덱스 형태로 반환하는 함수입니다.
그런데 SQL에서 NULL은 어떤 값과도 동등 비교(=)에 실패한다는 특징이 있습니다. 따라서 FIELD() 함수의 검색 문자열로 NULL이 전달되면, MySQL은 목록에서 일치하는 항목을 찾지 못한 것으로 판단하고 결과값으로 0을 반환합니다.
예제
mysql> Select FIELD(NULL,'Ram','is','good','boy'); +-------------------------------------+ | FIELD(NULL,'Ram','is','good','boy') | +-------------------------------------+ | 0 | +-------------------------------------+ 1 row in set (0.00 sec)
위 예제에서 검색 문자열 자리에 NULL이 전달되었기 때문에, 'Ram', 'is', 'good', 'boy'라는 문자열 목록과 아무런 비교도 성사되지 않습니다. 그 결과 MySQL은 0을 출력합니다.
추가로 알아두면 좋은 점
FIELD() 함수가 0을 반환하는 경우는 크게 두 가지입니다.
- 검색 문자열이 NULL인 경우 — NULL은 동등 비교가 불가능하므로 항상 0을 반환합니다.
- 검색 문자열이 목록에 존재하지 않는 경우 — 일치하는 항목이 없으므로 마찬가지로 0을 반환합니다.
반면, 검색 문자열이 목록에 존재하면 해당 위치의 인덱스(1부터 시작)가 반환됩니다. NULL 처리 로직을 포함한 쿼리를 작성할 때는 이러한 동작 방식을 반드시 염두에 두어야 의도치 않은 결과를 피할 수 있습니다.