您好,登錄后才能下訂單哦!
怎么在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)=1 colum like '%搜索內容' 等價于 instr(colum, '搜索內容', 1, -1)=length(colum)-length('搜索內容')+1
sql:
oracle || 代表拼接多個 數據庫列
一般情況:where instr(姓名||年齡||地址,'搜索內容',1,1) > 0
如果兩個數據列相鄰,采用 ',' 分割,防止搜索到不匹配內容:
where instr(姓名|| ',' || 年齡|| ',' || 地址 ,'搜索內容',1,1) > 0
如果字段為空,可以用 nvl (字段名,''),來處理,他的意思是 用 ‘'代替 空的內容
concat 拼接多個數據庫 列
instr 查詢
where instr (concat(姓名,年齡,地址),'搜索內容') > 0
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。