动态 LIKE 子句或类似 LIKE IN

Dynamic LIKE clause or something like LIKE IN

我有如下要求:

有两个表 i)TB_VALUES 和 ii)TB_KEYWORDS.

这是

的一些示例数据

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

我们现在必须从TB_VALUES中找到数据,这些数据的描述应该包含关键字。 这意味着对于 00001,描述应包含“SQL”或“Oracle”(case insensitive) 而对于 00002,描述应包含“SQL”(case 不敏感)。我们的输出应该是这样的:

ID Description
00001 Oracle is better than SQL Server
00001 Why should we use oracle
00002 pl/sql guidelines

为此我们必须这样写:

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  

但我想动态地做。

I can achieve this in PL/SQL but I want output as a view.

加入 + INSTR 可能会有帮助。

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>

如果它是一个视图(如您所提到的),那么 - 基于这些表 - 它可能看起来像这样:

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>