"NOT IN" 조건에서는 Null 허용 하위 쿼리를 사용하면 안 됩니다.

반응형

하위 쿼리와 함께 NOT IN을 사용하는 WHERE 절 조건은 해당 하위 쿼리가 NULL을 반환하는 경우 예기치 않은 결과를 가져옵니다. 반면에 NOT EXISTS 하위 쿼리는 동일한 조건에서 안정적으로 작동합니다.

이 규칙은 NOT IN이 하위 쿼리와 함께 사용될 때 문제를 발생시킵니다. 규칙 엔진에 테이블 정의에 대한 정보가 없기 때문에 이 규칙은 선택한 열이 Null 허용 열인지 확인하지 않습니다. 열이 Null 허용 여부를 수동으로 검토하는 것은 개발자의 몫입니다.

나쁜 예:

SELECT *
FROM my_table
WHERE my_column NOT IN (SELECT nullable_column FROM another_table)  -- Noncompliant; "nullable_column" may contain 'NULL' value and the whole SELECT query will return nothing

좋은 예:

SELECT *
FROM my_table
WHERE NOT EXISTS (SELECT 1 FROM another_table WHERE nullable_column = my_table.my_column)

또는

SELECT *
FROM my_table
WHERE my_column NOT IN (SELECT nullable_column FROM another_table WHERE nullable_column IS NOT NULL)
반응형