2011-09-08 94 views
0

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

以下是我们所需要的: 1.表PPL也包含在名称格式的数据的列名,姓 说记录 美国总统,奥巴 酒吧,奥巴马 和巴拉克·奥巴马。

  1. 我们希望根据搜索字符串选择记录。搜索字符串可以是姓名或姓氏。
  2. 我们希望根据搜索字符串进行精确搜索。 意思是如果搜索字符串是酒吧;它不应该返回巴拉克,奥巴马记录,应该只返回酒吧,奥巴马。 类似单击以查找姓氏部分。

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

以下方法我们试过了,直到现在;但这些都没有工作:

  1. 从ppl选择名称像'bar,%'或像'%,bar'这样的名称; 这是为名字部分工作,但不为姓部分工作。

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

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

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

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

+0

我不明白你为什么说像'bar',%'这样的名字或'%,bar'这样的名字不起作用。它为我做。当然,你没有任何姓'bar'的人... –

+0

它不适用于姓氏部分意思是像'%,oba'这样的名称或者像'oba,%'这样的名称不工作:( – adi

+0

有没有查询中有更多条件吗?无法使用括号,无法成功地混合AND和OR。 –

回答

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更好,但我不得不somethig类似的手。

例如不区分大小写:

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

希望这有助于...

0

根据样本数据和SQL你的问题,我不能看到你有一个问题:

首先,我复制你的表和数据(使用SQL加):

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                  

这也是正确的。

那么你会得到什么结果?