문법이 좀 이상하긴 하지만... 질문을 위해 쿼리를 수정하다가 발생된 오류라고 봅니다.
우선 null 과 '' 은 같습니다. 다시 말하면 '' 은 널입니다. nvl 할 필요가 없는거구요.
널은 일반 값과 달라서 비교 연산이 안됩니다.
a = '' 은 a = null 과 같은 식이며
널과의 비교식은 항상 거짓이므로 조회 안되는게 맞습니다.
그렇다면 왜 1로 바꾸면 byte 가 늘어날까요?
먼저 언급한 바와 같이 a = '' 이 조건은 항상 거짓이므로
이 조건이 있다는 말은 조회할 필요가 없다는 것이므로 테이블을 읽을 필요가 없는거구요.
nvl(a, '1') = '1' 로 바꾸면 조건을 체크해 봐야지만 결과를 알 수 있으므로 테이블을 읽습니다.
미리 nvl 처리를 한 a = '1' 이 안되는 이유는?
올려주신 쿼리가 문법에 맞지 않아 판단하기 힘드네요.
아마도 인라인 뷰안의 쿼리가 결과가 없지 않을까? 생각됩니다.
결과가 없는 것(0 row)과 Null 이라는 결과를 가진것(1 row) 는 다릅니다.
결과가 없는 것을 널을 리턴한걸로 착각한게 아닐까 생각되네요.
스칼라서브쿼리 내부에 결과가 없을 때 스칼라서브쿼리의 결과는 Null
1. SELECT bb.a FROM bb WHERE aa.a = bb.a => 결과 없음 (0 row)
2. SELECT NVL(bb.a, '1') FROM bb WHERE aa.a = bb.a => 결과 없음 (0 row)
3. SELECT (SELECT bb.a FROM bb WHERE aa.a = bb.a) aa FROM aa ==> 결과 (null)
4. SELECT (SELECT NVL(bb.a, '1') FROM bb WHERE aa.a = bb.a) aa FROM aa ==> 결과 (null)
5. SELECT NVL((SELECT bb.a FROM bb WHERE aa.a = bb.a), '1') aa FROM aa ==> 결과 ('1')