Есть две проблемы:
- SUBSTR (T_ID, 3,100) не всегда будет возвращать число - нам нужно рассмотреть только числовой запрос
- Если мы применим что-либо в WHEREусловие представления, Порядок выполнения условия WHERE - вызов оптимизатора Oracle.
Пожалуйста, смотрите ниже код:
-- Data preparation
create table TEST (T_ID varchar2(20));
INSERT INTO TEST VALUES('AB1000'); -- Good data
INSERT INTO TEST VALUES('AB1001'); -- Good data
INSERT INTO TEST VALUES('CD1001'); -- Good data
INSERT INTO TEST VALUES('XY1004'); -- Good data
INSERT INTO TEST VALUES('XYZ1004'); -- Bad data
-
-- Data in the table
SELECT * FROM TEST;
Выход

-- You need to create your view as following
-- rownum is used so that WHERE clause of view is executed first
-- and then any external WHERE clause on the view is executed
CREATE OR REPLACE VIEW ABC_NEWVIEW AS
SELECT
ID
FROM
(
SELECT
CAST(SUBSTR(T_ID, 3, 100) AS NUMBER) AS ID,
ROWNUM RN
FROM
TEST
WHERE
CASE
WHEN TRIM(TRANSLATE(SUBSTR(T_ID, 3, 100), '0123456789-,.', ' ')) IS NULL THEN 'numeric'
ELSE 'alpha'
END = 'numeric'
)
-
-- View
SELECT * FROM ABC_NEWVIEW
Выход

-- Query using WHERE condition
SELECT *
FROM ABC_NEWVIEW
WHERE
ID = 1001
Выход

Демонстрацию можно найти по следующей ссылке:
Демонстрация DB Fiddle
Демонстрацию VIEW можно посмотреть без ROWNUM: ВоспроизведеноВаша проблема - Так что проблема заключается в порядке исполнения.
Ура !!