0

我们想根据搜索字符串从表中搜索记录。此搜索是存储过程的一部分。

以下是我们需要的: 1. 在表 ppl 中有列名称,其中包含名称格式的数据,说记录是 barack,oba bar,obama 和 barack,obama。

  1. 我们想根据搜索字符串选择记录。搜索字符串可以是姓名或姓氏。
  2. 我们想要基于搜索字符串的精确搜索。表示搜索字符串是否为 bar;它不应该返回 barack,obama 记录并且应该只返回 bar,obama。类似的精确搜索姓氏部分。

  3. 我们不知道搜索字符串是否有名字或姓氏。所以搜索字符串甚至可以是“oba” ..它应该只返回“barack,oba”记录。

遵循我们迄今为止尝试过的方法;但这些都不起作用:

  1. 从 ppl 中选择名称,其中名称如 'bar,%' 或名称如 '%,bar'; 这适用于姓名部分,但不适用于姓氏部分。

从 ppl 中选择名称,其中名称如 'oba,%' 或名称如 '%,oba'; 没有给出正确的结果。

  1. 从 ppl 中选择名称,其中名称 = ANY('%,oba',oba,%'); - 不工作

  2. select name from ppl where regexp_like (name,'^,oba$') OR regexp_like (name,'oba$,^'); - 不工作

我请求你分享你在这种情况下的想法。

4

2 回答 2

1

您需要使用正则表达式 (REGEX)。

有许多网站描述了如何使用它们,例如:

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_regexp.htm

http://www.dba-oracle.com/t_regular_expressions.htm

http://orafaq.com/node/2404

对于您所描述的示例(这就是我必须继续进行的),您可以使用:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'c') > 0;

以编程方式将v_name替换为您的名称字符串。如果要不区分大小写地搜索名称字符串,则:

SELECT name_column
  FROM ppl
 WHERE REGEXP_INSTR(name_column, '^.*'||v_name||'(, *|$).*', 1, 1, 0, 'i') > 0;

编辑:您可能使用 REGEXP_LIKE 比 REGEXP_INSTR 更好,但我有一些类似于手的东西。

例如不区分大小写:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'i');

区分大小写:

SELECT name_column
  FROM ppl
 WHERE REGEXP_LIKE(name_column, '^.*'||v_name||'(, *|$).*', 'c');

希望这可以帮助...

于 2011-09-08T12:58:08.117 回答
0

根据示例数据和 SQL 您的问题,我看不出您有问题:

首先,我复制了您的表和数据(使用 SQL Plus):

SQL> create table ppl (name varchar2(30));

Table created.

SQL> insert into ppl values ('barack,oba');

1 row created.

SQL> insert into ppl values ('bar,obama');

1 row created.

SQL> insert into ppl values ('barack,obama');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from ppl;

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      
bar,obama                                                                       
barack,obama                                                                    

现在您的查询:

SQL> select * from ppl where name like 'bar,%' or name like '%,bar';

NAME                                                                            
------------------------------                                                  
bar,obama                                                                       

这是正确的。

SQL> select * from ppl where name like 'oba,%' or name like '%,oba';

NAME                                                                            
------------------------------                                                  
barack,oba                                                                      

这也是正确的。

那么你会得到什么结果呢?

于 2011-09-08T13:54:41.080 回答