I have requirement like below:
There are two tables i)TB_VALUES and ii)TB_KEYWORDS.
Here are some sample data for
TB_VALUES:
ID        Description                     
00001     Oracle is better than SQL Server
00001     Python is good                  
00001     Why should we use oracle        
00002     pl/sql guidelines               
00002     python tutorial                 
TB_KEYWORDS:
ID        Keywords   
00001     Oracle     
00001     SQL        
00002     SQL        
We have to now find the data from TB_VALUES , the Description of those data should contain the keyword. That means for 00001 the description should contain “SQL” or “Oracle” (case insensitive) and for 00002 the description should contain “SQL“(case insensitive) . Our output should be like this :
ID        Description                     
00001     Oracle is better than SQL Server
00001     Why should we use oracle        
00002     pl/sql guidelines               
For that we have to write something like this:
SELECT V.ID,V.DESCRIPTION FROM TB_VALUES V JOIN TB_KEYWORDS K ON V.ID = K.ID WHERE UPPER(V.DESCRIPTION) LIKE '%SQL%' OR UPPER(V.DESCRIPTION) LIKE '%ORACLE%' AND V.ID = 00001 UNION ALL SELECT V.ID,V.DESCRIPTION FROM TB_VALUES V JOIN TB_KEYWORDS K ON V.ID = K.ID WHERE UPPER(V.DESCRIPTION) LIKE '%SQL%' AND V.ID = 00002
But I want to do it dynamically.
I can achieve this in PL/SQL but I want output as a view.
Advertisement
Answer
Join + INSTR might help.
SQL> with
  2  -- sample data
  3  tb_values (id, description) as
  4    (select 1, 'oracle is better than SQL server' from dual union all
  5     select 1, 'python is Good'                   from dual union all
  6     select 1, 'Why should we use Oracle'         from dual union all
  7     select 2, 'pl/sql guidelines'                from dual union all
  8     select 2, 'python tutorial'                  from dual
  9    ),
 10  tb_keywords (id, keywords) as
 11    (select 1, 'Oracle' from dual union all
 12     select 1, 'SQL'    from dual union all
 13     select 2, 'SQL'    from dual
 14    )
 15  -- query you need
 16  select distinct
 17    k.id,
 18    v.description
 19  from tb_keywords k join tb_values v on v.id = k.id
 20    and instr(lower(v.description), lower(k.keywords)) > 0
 21  order by k.id, v.description;
        ID DESCRIPTION
---------- --------------------------------
         1 oracle is better than SQL server
         1 Why should we use Oracle
         2 pl/sql guidelines
SQL>
If it were a view (as you mentioned), then – based on those tables – it might look like this:
SQL> create or replace view v_key as
  2  select distinct
  3    k.id,
  4    k.keywords,
  5    v.description
  6  from tb_keywords k join tb_values v on v.id = k.id
  7    and instr(lower(v.description), lower(k.keywords)) > 0;
View created.
SQL>
SQL> select * from v_key
  2  where lower(keywords) = 'sql';
        ID KEYWOR DESCRIPTION
---------- ------ --------------------------------
         1 SQL    oracle is better than SQL server
         2 SQL    pl/sql guidelines
SQL>