2011-09-08 93 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                  

這也是正確的。

那麼你會得到什麼結果?