1. 程式人生 > >like查詢替換方式

like查詢替換方式

Oracle 中一遇到模糊查詢,我們就會不由自主地想到 LIKE 關鍵字,一般情況下都是屢試不爽;

但是如果你的資料量很大,就不得不考慮查詢效率的問題,這個時候如果用 LIKE 關鍵字的話可能

效率就非常低,你會不由自主地去思考用更有效率的方法去代替 LIKE,不知道你有沒有

找出更好的方法。

下面是個人拙見(有更好方法的朋友可以共享一下心得):

 INSTR()來代替 LIKE 關鍵字。

具體舉例如下:

比如我們有一張號碼錶 TEL 表,其中有欄位 TELNUM ,  假如表中有十幾萬條資料,

我們要查詢以158開頭的號碼的資訊:我們肯定會不約而同的想到

SELECT * FROM TEL WHERE TELNUM LIKE '158%';

毫無疑問這個sql是正確的,但是,你會發現我們的查詢速度似乎很慢,遇到這種情況總是讓人感到很憋屈,怎麼辦?下面是我的辦法:用函式 INSTR代替 LIKE 如下:

SELECT * FROM TEL WHERE INSTR(TELNUM, '158') = 1;

什麼意思呢?,沒用過這個函式的可能不太知道什麼意思,下面說一下 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

注:

  instr(title,’手冊’)>0 相當於like

  instr(title,’手冊’)=0 相當於not like

下面看看我們剛才寫的那個sql

SELECT * FROM TEL WHERE INSTR(TELNUM, '158') = 1;

這個能看明白了吧,這就是說,我們在TELNUM中查詢 '158',如果在第一個位置就找到了,那麼就查詢出這條資料,這樣就和 LIKE 一個效果了。

在查詢時經常使用like作為關鍵字進行模糊查詢,在生產環境中由於資料量較大,使用like查詢時比較慢,嘗試了一些方法,最終發現使用Oracle的instr函式可以顯著提高查詢的效率.

關於資料量:

SELECTcount(1FROM t_partner_role; 

--612565

SELECTcount(1FROM T_VENDOR_REPOSITORY; 

--1178044  

sql語句查詢時間比較:

SELECT count(id)

  from (select t.id

          FROM T_VENDOR_REPOSITORY t

         WHERE t.deleted = 0

           and t.partnerid in (select distinct (tpr.partnerid)

                                 from t_partner_role tpr

                                where tpr.partnerroletype in (1)

                                  and tpr.deleted = 0)

           and t.VENDORNAME like '%拓維資訊系統股份有限公司%');

--使用like查詢耗時 1.570ms

SELECT count(id)
  from (select t.id
          FROM T_VENDOR_REPOSITORY t
         WHERE t.deleted = 0
           and t.partnerid in (select distinct (tpr.partnerid)
                                 from t_partner_role tpr
                                where tpr.partnerroletype in (1)
                                  and tpr.deleted = 0)
           and instr(t.VENDORNAME,'拓維資訊系統股份有限公司',1,1)!=0);

--使用instr查詢耗時 0.654ms

通過真實資料的比較發現使用instr的查詢效率要高於like,以後再優化like查詢時可以考慮.

使用內部函式instr,可代替傳統的like方式查詢,並且速度更快。

           instr函式,第一個引數是欄位,第二個引數是要查詢的串,返回串的位置,第一個是1,如果沒找到就是0.

           例項:

  1. SELECT  
  2.         o.user_name  
  3. FROM  
  4.     sys_user o  
  5. WHERE  
  6.     INSTR(o.user_name,'主任')>0  

        查詢使用者名稱稱中包含主任的使用者,作用類似於like ‘%主任%’

http://blog.csdn.net/lk_blog/article/details/47112209

http://blog.csdn.net/u013492963/article/details/24382191

相關推薦

like查詢替換方式

在Oracle 中一遇到模糊查詢,我們就會不由自主地想到 LIKE 關鍵字,一般情況下都是屢試不爽; 但是如果你的資料量很大,就不得不考慮查詢效率的問題,這個時候如果用 LIKE 關鍵字的話可能 效率就非常低,你會不由自主地去思考用更有效率的方法去代替 LIKE,不知道你

SQL Server 實現跨服務器查詢方式

lol linked server nbsp drop false err dlink pre 幹貨如下: exec sp_addlinkedserver ‘ITSV‘, ‘‘, ‘SQLOLEDB‘, ‘crs.***.com,6598‘ exec sp_addl

MySQL 效率不高的LIKE查詢

position www. select 簡單 %d sele 使用 mysql 模糊 在一些小型的網站都mysql采用like查詢語句,簡稱模糊查詢,使用百分號 %字符來表示任意字符 作為查詢的標準,下面簡單說說常見的用法。 1,標準的用法 SELEC

Django之ORM優化查詢方式

 ORM優化查詢的方式 一、假設有三張表 Room id 1 2 .. 1000 User: id 1 .. 10000 Booking: user_id room

30. 使用子查詢方式找出屬於Action分類的所有電影對應的title,description

題目描述 film表 欄位 說明 film_id 電影id title 電影名稱 description 電影描述資訊

mysql update where子查詢實現方式

mysql的update的一些特點 1、更新的表不能在set和where中子查詢; 2、可以對多個表進行更新(sqlserver不行);   如:update ta a,tb b set a.Bid=b.id ,b.Aid=a.id;   3、update 後面可

響應式:媒介查詢方式及常見測試特性

link標籤 <link rel='stylesheet' type='text/css' media='screen and (orientation:portrait) and (min-width:800px)' href='portrait-screen.css' />

vim下多行查詢替換簡單命令

###查詢替換第2行到第5行的內容 :2,5 s/'searchString'/'string'/g ###查詢替換第2行到檔案尾部的內容 :2,. s/'searchString'/'string'/g ###查詢替換第2行到行尾的內容 :2,$ s/'sear

設定excel2016的查詢替換範圍為整個工作薄

預設情況下,在excel2016中查詢資料的話,只是當前的工作表而不是整個工作薄,這樣操作起來很麻煩,怎麼樣設定excel2016中查詢範圍為整個工作薄呢?下面就來看一下操作的方法吧。 怎麼設定excel2016的查詢替換範圍為整個工作薄工具/原料excel2016方法/步驟1首先用excel2016開啟要

mysql Like查詢使用索引的情況

EXPLAIN SELECT *FROM  `hb_send_list`  WHERE hongbao_id LIKE '%AA1317B32755BDFC1B8036' id select_type table type

eclipse使用技巧---使用正則表示式查詢替換【反編譯後替換/* */】

1,Eclipse ctrl+f 開啟查詢框 2,選中 Regular expressions (正則表示式)去掉/* */(eclipse)        /\*(.|[\r\n])*?\*/ 去掉//(eclipse) &nb

notepad++ 正則表示式 高階查詢替換技巧(一)

正則表示式:(^\w+$) 替換式:db2 \"delete from \1 \" \r\ndb2 \"import from \.\/data\/\1\.ixf of ixf modified by identityignore insert into \1 \" 輸入

PowerHA IP 替換方式與IP 別名方式的區別

IPAT via replacement (IP替換) The service IP label replaces the boot IP address on the interface. The heartbeat IP 

linux bash 的檔案查詢替換 檔案操作

簡介:我現在Mac系統上,有多個版本的hadoop,多個版本的hive,開發的時候需要排列組合。每次都修改配置,很麻煩,所有我想寫個shell指令碼,幫我自動化配置各種版本,主要是對.bash_pro

linux查詢替換命令

去除空格: cat file.txt | tr -d "[:space:]" > file.txt  cat file.txt | tr -d "[:blank:]> file.txt  sed -r 's/\s+//g' filename   peerl -p

Django學習【第28篇】:優化查詢方式 優化查詢方式

優化查詢的方式 一、假設有三張表 Room id 1 2 .

程式設計的兩種方式執行Spark SQL查詢方式一)

現在我們來實現在自定義程式中編寫Spark SQL查詢程式。 實現查詢的方式有兩種: 方式一:通過反射推斷schema。 方式二:通過structtype直接指定schema。 我們先用方式一來實現自定義查詢。 首先建立一個team.txt檔案,內容有5列,分別是id,球隊

程式設計的兩種方式執行Spark SQL查詢方式二)

現在我們來實現在自定義程式中編寫Spark SQL查詢程式。 實現查詢的方式有兩種: 方式一:通過反射推斷schema。 方式二:通過structtype直接指定schema。 這次我們用方式二來實現自定義查詢。 具體程式如下: package cn.allengao.s

mybatis中模糊查詢方式

<!--Mapper.xml中如何進行模糊查詢--> <sql id="brand_columns"> id, name, firstChar,brandName </sql> <select id

Mybatis中,oracle,mysql,SqlServer,db2模糊查詢書寫方式

oracle中: '%'||#{}||'%' <select id=""> select * from 表名 where 欄位名 like '%'||#{模糊查關鍵字}||'%' </select> mysql中: CONCA