К воспроизвести проблему :
create table foo (
CHAR_COLUMN varchar2(10)
);
create table bar (
CHAR_COLUMN varchar2(10)
);
insert into foo (CHAR_COLUMN) values ('1');
insert into foo (CHAR_COLUMN) values ('2');
insert into bar (CHAR_COLUMN) values ('1');
insert into bar (CHAR_COLUMN) values ('yellow');
Затем при запросе числового значения 1
первая таблица запросов работает, а вторая - нет:
select * from foo where CHAR_COLUMN = 1;
select * from bar where CHAR_COLUMN = 1;
Когда вы просите Oracle разрешить это сравнение:
WHEN CHAR_COLUMN = 1
... Oracle внутренне преобразует запрос в:
WHEN TO_NUMBER(CHAR_COLUMN) = 1
В моем примере это можно заметить в плане объяснения:
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost | Time |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 7 | 3 | 00:00:01 |
| * 1 | TABLE ACCESS FULL | FOO | 1 | 7 | 3 | 00:00:01 |
---------------------------------------------------------------------
Predicate Information (identified by operation id):
------------------------------------------
* 1 - filter(TO_NUMBER("CHAR_COLUMN")=1)