动态 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>
我有如下要求:
有两个表 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>