Предложение Dynami c LIKE или что-то вроде LIKE IN - PullRequest
0 голосов
/ 05 марта 2020

У меня есть требование, как показано ниже:

Есть две таблицы: 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 нечувствительный ) и для 00002 описание должно содержать «SQL» ( регистр нечувствительный ). Наш вывод должен быть таким:

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  

Но я хочу сделать это динамически.

Я могу добиться этого в PL / SQL, но я хочу вывод в виде представления.

1 Ответ

1 голос
/ 05 марта 2020

Присоединение + 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...