Проблема заключается в трехуровневой логике, присущей базам данных SQL.
Любое выражение, сравнивающее значение с NULL, возвращает значение «unknown», которое отличается от «true» или «false».
1 = 1 true
1 = 0 false
1 = NULL undefined
NULL = NULL undefined (!)
Ваш запрос запрашивает записи, соответствующие критерию "tvalue NOT IN (3, 4)". Это вернет набор данных, в котором соблюдаются критерии соответствия. Поскольку сравнения значений NULL не возвращают «истинного» значения (и не «ложного»), они НЕ включаются в ваш возвращаемый набор.
Существует несколько обходных путей для этого поведения: во-первых, нужно явно проверить на null:
WHERE tvalue IS NULL OR tvalue NOT IN (3,4)
Другой - использовать COALESCE для исключения сравнений NULL:
WHERE COALESCE(tvalue, 0) NOT IN (3,4)
Для больших таблиц первый подход, вероятно, наиболее эффективен: сравнение с выражением (то есть выражением COALESCE) означает, что выражение должно выполняться для каждой строки в базовом наборе данных.