1. 程式人生 > 資料庫 >Oracle 實現 一個關鍵字 匹配多個 欄位的方法

Oracle 實現 一個關鍵字 匹配多個 欄位的方法

有這麼一個需求,滿足只有一個輸入框的條件下,支援不同資料列的搜尋結果。

說白了,就是這個 輸入框 既可以用來 搜尋姓名,也可以搜尋 年齡,地址等。

分析:

一般情況下,我們的一個輸入框對應 資料庫 的某一列資訊的搜尋,比如,要搜尋姓名為 ‘李' 姓開頭的,那麼對應的 sql 就是

where name like '李%'

但是,現在輸入框有了不確定性,不知道使用者到底會輸入什麼,導致我們後臺的 sql 不知道該如何對應了,

比如,使用者輸入 18,很明顯,使用者是想搜尋 年齡為 18 的使用者,如果 後臺sql 還是 where name like '18%',那麼就會 搜尋不到內容了。

方案一:

我們可以用 or 這種關鍵字來實現 多欄位匹配,

比如:where name like '%搜尋內容%' or age like '%搜尋內容%'

這種方案對於 搜尋欄位比較 少的可以嘗試,但是效率不高。

方案二:推薦

我們可以換一種思路

假設我們的資料庫每一行都有一個完整的列 (colum),這個列的內容為 該行所有欄位的內容。

那麼我們搜尋的sql 的可以改寫為 where colum like '%搜尋內容%'

這樣 不論搜尋 姓名 ,還是 年齡,地址 等,我們都可以查到。

既然到這裡了,我相信你已經明白該怎麼做了。

其實,就是用 sql 把需要可能 被使用者搜尋的 資料庫欄位拼接 起來,然後再 like '%搜尋內容%' 就可以了。

oracle 做法

可以採用 instr() 函式,這裡說下 INSTR()函式的作用

INSTR(引數1,引數2)其實是一個查詢字串的函式,返回的是字串查詢的位置,它有兩個引數都是字元型別,如果找到則返回引數2在引數1中的位置,如果沒有找到則返回 0。

SELECT INSTR('abcde','a') FROM DUAL;

--------------------------------------------

1

--------------------------------------------

結果分析,因為a在abcde的第一個位置,所以返回1

SELECT INSTR('abcde','f') FROM DUAL;

--------------------------------------------

0

--------------------------------------------

結果分析,因為f在abcde串中找不到,所以返回0

這裡 對比 like 與 instr() 函式, 如果對效能 要求比較嚴格的 童鞋,記得來這裡 用 instr () 來 替換 like 關鍵字

colum like '%搜尋內容%'
等價於
instr(colum,'搜尋內容',1,1)>0
colum like '搜尋內容%'
等價於
instr(colum,1)=1
colum like '%搜尋內容'
等價於
instr(colum,-1)=length(colum)-length('搜尋內容')+1

sql:

oracle || 代表拼接多個 資料庫列

一般情況:where instr(姓名||年齡||地址,1) > 0

如果兩個資料列相鄰,採用 ',' 分割,防止搜尋到不匹配內容:

where instr(姓名|| ',' || 年齡|| ',' || 地址,1) > 0

如果欄位為空,可以用 nvl (欄位名,''),來處理,他的意思是 用 ‘'代替 空的內容

mysql

concat 拼接多個數據庫 列

instr 查詢

where instr (concat(姓名,年齡,地址),'搜尋內容') > 0

總結

以上所述是小編給大家介紹的Oracle 實現 一個關鍵字 匹配多個 欄位的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回覆大家的!