想要根据搜索字符串从表中搜索记录

时间:2011-09-08 11:35:08

标签: oracle java-stored-procedures

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

以下是我们所需要的: 1.在表ppl中,列名包含name,surname格式的数据 说记录是 巴拉克,奥巴 酒吧,奥巴马 和巴拉克,奥巴马。

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

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

  4. 我们已经尝试了以下方法,直到现在;但这些都没有奏效:

    1. 从ppl中选择名称,例如'bar,%'或名称如'%,bar'; 这适用于名称部分,但不适用于姓氏部分。
    2. 从ppl中选择名称,其中名称为'oba,%'或名称如'%,oba'; 没有给出正确的结果。

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

      2. 从ppl中选择名称,其中regexp_like(name,'^,oba $')或regexp_like(name,'oba $,^'); - 不工作

      3. 我请求您在这种情况下分享您的想法。

2 个答案:

答案 0 :(得分: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_INSTR更好地使用REGEXP_LIKE,但我有一些类似于手的。

e.g。不区分大小写:

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');

希望这会有所帮助......

答案 1 :(得分: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                                                                      

这也是正确的。

那么你得到的结果是什么?