I'm still not sure exactly what you're getting at...
But you can create an index on the virtual column and the database can use it:
create index i on t2 (z);
set serveroutput off
select * from t2
where z = 'THIS';
select *
from table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));
PLAN_TABLE_OUTPUT
EXPLAINED SQL STATEMENT:
------------------------
select * from t2 where z = 'THIS'
Plan hash value: 3892044154
--------------------------------------------
| Id | Operation | Name |
--------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 |
| 2 | INDEX RANGE SCAN | I |
--------------------------------------------
In fact, if you use the same expression on the source column as in the virtual one, that can use the index too!
select * from t2
where upper(y) = 'THIS';
select *
from table(dbms_xplan.display_cursor(null, null, 'BASIC LAST'));
PLAN_TABLE_OUTPUT
EXPLAINED SQL STATEMENT:
------------------------
select * from t2 where upper(y) = 'THIS'
Plan hash value: 3892044154
--------------------------------------------
| Id | Operation | Name |
--------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | TABLE ACCESS BY INDEX ROWID| T2 |
| 2 | INDEX RANGE SCAN | I |
--------------------------------------------