本篇文章為大家展示了position函數怎么在postgresql 中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
創新互聯專注于企業全網整合營銷推廣、網站重做改版、金堂縣網站定制設計、自適應品牌網站建設、H5頁面制作、商城網站制作、集團公司官網建設、外貿網站建設、高端網站制作、響應式網頁設計等建站業務,價格優惠性價比高,為金堂縣等各大城市提供網站開發制作服務。postgresql中position函數提供從頭查找返回第一個匹配到字符串的下標。
而我需要返回從后向前查找第一個匹配到的坐標,但是postgressql并未提供相關函數,所以自己寫了如下代碼提供相關功能:
CREATE OR REPLACE FUNCTION lastindexof(text, character) RETURNS integer AS $BODY$ begin if $1 is null then return NULL; end if; for i in reverse length($1) .. 1 loop if substr($1,i,1) = $2 then return i; end if; end loop; return NULL; end $BODY$ LANGUAGE plpgsql IMMUTABLE STRICT
本來以為事情完美解決,但是性能的差距卻讓人感覺很失望,如下圖

數據庫原生的“position”和自己提供“lastindexof”,居然產生了30倍以上的性能差距,那么探究緣由就變成一個有意思的事情。也算第一次嘗試翻閱數據庫源碼,中間總是有點小麻煩,不過當我找到如下代碼的時候,那種恍然大悟的欣喜也算滿足了自己求知欲。

注意看1054行,運用了指針~ 可見數據庫底層運算,用了引用傳遞,而我自己寫的函數是一個拷貝傳遞。
原因找到了,解決問題也就手到擒來,拿C寫一個擴展?或者?
本可以拿C寫一些底層代碼練練手,不過那又需要重新編譯等等,時間有限,留給以后去做吧,先想個簡單的辦法去解決它。
select length(dir) -position('/' in reverse(dir)) +1 from log_hup_ftp_30測試性能截圖

好吧,雖然由于函數的復雜性增加,性能還是慢了一倍多,但是比起之前5s之久還是快了不少。
tips:
最近得到德哥的回答,引用傳遞可以使用游標類型!再次謝謝德哥~
補充: SQL之查詢函數LOCATE、POSITION、INSTR、FIND_IN_SET、IN、LIKE
LOCATE()
返回要查詢的字符串在被查詢字符串里第一次出現的位置
注:當在 MySQL 4.0 中時,如有任一參數是一個二進制字符串,它才是字母大小寫敏感的
LOCATE(substr,str)
返回substr字符串在str里第一次出現的位置,沒有返回0
SELECT LOCATE('.',t.str)FROM `table` t;
>5LOCATE(substr,str,pos)
返回substr字符串在str里pos(起始位置)出現的位置,沒有返回0
注:pos必須大于第一次出現的位置,才能顯示第二次出現的位置
SELECT LOCATE('.',t.str,6)FROM `table` t;
>9//當小于等于第一次出現的位置(5)時,返回的還是第一次出現的位置POSITION()
返回要查詢的字符串在被查詢字符串里第一次出現的位置(和locate用法一樣,查了很多資料position是locate的別名)
POSITION(substr IN str)
返回substr字符串在str出現的位置,沒有返回0
SELECT POSITION('cn' IN t.str)FROM `table` t;
>10INSTR()
返回要查詢的字符串在被查詢字符串里第一次出現的位置。這和LOCATE()的雙參數形式相同,只是參數的順序被顛倒。
INSTR(str,substr)
返回substr字符串在str出現的位置,沒有返回0
SELECT INSTR(t.str,'com')FROM `table` t; >6
FIND_IN_SET()
返回在集合中的索引位置(豎向發展)
FIND_IN_SET(str,strlist)
返回str1在strlist集合中的索引位置
SELECT FIND_IN_SET('demo.com.cn',t.str) FROM `table` t;
>1//返回索引IN()
返回在集合中的索引位置(同FIND_IN_SET)
str IN (strlist)
返回str1在strlist集合中的索引位置
SELECT 'demo.com.cn' IN(t.str) FROM `table` t; >1//返回索引
LIKE
返回類似(模糊)字符的集合
LIKE %str%
返回以str類似的集合
上述內容就是position函數怎么在postgresql 中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注創新互聯行業資訊頻道。
當前名稱:position函數怎么在postgresql中使用-創新互聯
分享網址:http://www.yijiale78.com/article36/ccdpsg.html
成都網站建設公司_創新互聯,為您提供響應式網站、網站改版、網站收錄、定制開發、營銷型網站建設、網站內鏈
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯