Oracle 實(shí)現(xiàn) 一個(gè)關(guān)鍵字 匹配多個(gè) 字段的方法
有這么一個(gè)需求,滿足只有一個(gè)輸入框的條件下,支持不同數(shù)據(jù)列的搜索結(jié)果。
說白了,就是這個(gè) 輸入框 既可以用來 搜索姓名,也可以搜索 年齡,地址等。
分析:
一般情況下,我們的一個(gè)輸入框?qū)?yīng) 數(shù)據(jù)庫 的某一列信息的搜索,比如,要搜索姓名為 ‘李' 姓開頭的,那么對應(yīng)的 sql 就是
where name like '李%'
但是,現(xiàn)在輸入框有了不確定性,不知道用戶到底會(huì)輸入什么,導(dǎo)致我們后臺(tái)的 sql 不知道該如何對應(yīng)了,
比如,用戶輸入 18,很明顯,用戶是想搜索 年齡為 18 的用戶,如果 后臺(tái)sql 還是 where name like '18%',那么就會(huì) 搜索不到內(nèi)容了。
方案一:
我們可以用 or 這種關(guān)鍵字來實(shí)現(xiàn) 多字段匹配,
比如:where name like '%搜索內(nèi)容%' or age like '%搜索內(nèi)容%'
這種方案對于 搜索字段比較 少的可以嘗試,但是效率不高。
方案二:推薦
我們可以換一種思路
假設(shè)我們的數(shù)據(jù)庫每一行都有一個(gè)完整的列 (colum),這個(gè)列的內(nèi)容為 該行所有字段的內(nèi)容。
那么我們搜索的sql 的可以改寫為 where colum like '%搜索內(nèi)容%'
這樣 不論搜索 姓名 ,還是 年齡,地址 等,我們都可以查到。
既然到這里了,我相信你已經(jīng)明白該怎么做了。
其實(shí),就是用 sql 把需要可能 被用戶搜索的 數(shù)據(jù)庫字段拼接 起來,然后再 like '%搜索內(nèi)容%' 就可以了。
oracle 做法
可以采用 instr() 函數(shù),這里說下 INSTR()函數(shù)的作用
INSTR(參數(shù)1,參數(shù)2)其實(shí)是一個(gè)查找字符串的函數(shù),返回的是字符串查找的位置,它有兩個(gè)參數(shù)都是字符類型,如果找到則返回參數(shù)2在參數(shù)1中的位置,如果沒有找到則返回 0。
SELECT INSTR('abcde', 'a') FROM DUAL;
--------------------------------------------
1
--------------------------------------------
結(jié)果分析,因?yàn)閍在abcde的第一個(gè)位置,所以返回1
SELECT INSTR('abcde', 'f') FROM DUAL;
--------------------------------------------
0
--------------------------------------------
結(jié)果分析,因?yàn)閒在abcde串中找不到,所以返回0
這里 對比 like 與 instr() 函數(shù), 如果對性能 要求比較嚴(yán)格的 童鞋,記得來這里 用 instr () 來 替換 like 關(guān)鍵字
colum like '%搜索內(nèi)容%' 等價(jià)于 instr(colum, '搜索內(nèi)容', 1, 1)>0 colum like '搜索內(nèi)容%' 等價(jià)于 instr(colum, '搜索內(nèi)容', 1, 1)=1 colum like '%搜索內(nèi)容' 等價(jià)于 instr(colum, '搜索內(nèi)容', 1, -1)=length(colum)-length('搜索內(nèi)容')+1
sql:
oracle || 代表拼接多個(gè) 數(shù)據(jù)庫列
一般情況:where instr(姓名||年齡||地址,'搜索內(nèi)容',1,1) > 0
如果兩個(gè)數(shù)據(jù)列相鄰,采用 ',' 分割,防止搜索到不匹配內(nèi)容:
where instr(姓名|| ',' || 年齡|| ',' || 地址 ,'搜索內(nèi)容',1,1) > 0
如果字段為空,可以用 nvl (字段名,''),來處理,他的意思是 用 ‘'代替 空的內(nèi)容
mysql
concat 拼接多個(gè)數(shù)據(jù)庫 列
instr 查詢
where instr (concat(姓名,年齡,地址),'搜索內(nèi)容') > 0
總結(jié)
以上所述是小編給大家介紹的Oracle 實(shí)現(xiàn) 一個(gè)關(guān)鍵字 匹配多個(gè) 字段的方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
相關(guān)文章
oracle設(shè)置密碼復(fù)雜度及設(shè)置超時(shí)退出的功能
我們都知道密碼策略加固的參數(shù)一般包括密碼長度、復(fù)雜度檢測、最大最小使用時(shí)間、過期警報(bào)時(shí)間、最大登錄失敗次數(shù)以及鎖定時(shí)間等設(shè)置,下面這篇文章主要給大家介紹了關(guān)于oracle設(shè)置密碼復(fù)雜度及設(shè)置超時(shí)退出功能的相關(guān)資料,需要的朋友可以參考下2022-06-06Oracle數(shù)據(jù)表保留一條重復(fù)數(shù)據(jù)簡單方法
最近開發(fā)的時(shí)候遇到一個(gè)任務(wù),需要對重復(fù)的數(shù)據(jù)進(jìn)行篩選,所以下面這篇文章主要給大家介紹了關(guān)于Oracle數(shù)據(jù)表保留一條重復(fù)數(shù)據(jù)的簡單方法,需要的朋友可以參考下2023-11-11使用zabbix監(jiān)控oracle表數(shù)據(jù)的方法
有時(shí)候我們需要對表中的數(shù)據(jù)進(jìn)行監(jiān)控,比如筆者的這種場景:?微服務(wù)自己實(shí)現(xiàn)了定時(shí)任務(wù),定時(shí)任務(wù)的執(zhí)行結(jié)果會(huì)記錄到某張日志表中,如果定時(shí)任務(wù)執(zhí)行失敗將會(huì)對業(yè)務(wù)產(chǎn)生影響,所以筆者用zabbix+python進(jìn)行了監(jiān)控,當(dāng)任務(wù)失敗時(shí)?進(jìn)行告警,需要的朋友可以參考下2024-04-04PLSQL Developer連接oracle數(shù)據(jù)庫配置教程
這篇文章主要介紹了PLSQL Developer連接oracle數(shù)據(jù)庫配置步驟,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09整理Oracle數(shù)據(jù)庫中數(shù)據(jù)查詢優(yōu)化的一些關(guān)鍵點(diǎn)
這篇文章主要介紹了Oracle數(shù)據(jù)庫中數(shù)據(jù)查詢優(yōu)化的一些關(guān)鍵點(diǎn)的整理,包括多表和大表查詢等情況的四個(gè)方面的講解,需要的朋友可以參考下2016-01-01