朋友們,我們?cè)趯?xiě)SQL腳本時(shí),經(jīng)常會(huì)碰到一些個(gè)看似簡(jiǎn)單、卻無(wú)從下手的問(wèn)題,這類問(wèn)題說(shuō)大不大、說(shuō)小也不小,經(jīng)常會(huì)搞的我們很頭痛。
比如,
如何使用SQL語(yǔ)句統(tǒng)計(jì)字符在某個(gè)字符串中出現(xiàn)的次數(shù)?
這就是個(gè)看似簡(jiǎn)單的問(wèn)題,遍查SQL支持的字符串函數(shù)(至少在MSSQL中),并沒(méi)有發(fā)現(xiàn)有直接可用的函數(shù)。其實(shí),絕大部分情況下,只要我們學(xué)會(huì)了變通,很多讓我們苦惱的問(wèn)題很容易就迎刃而解了。不信請(qǐng)您往下看。
不變通也能解決問(wèn)題,雖然復(fù)雜,但用到的技術(shù)都是基本功因?yàn)闆](méi)有相應(yīng)的內(nèi)置函數(shù),大部分朋友首先想到的是:
把整個(gè)字符串按照字符位置遍歷,一個(gè)個(gè)匹配
。這種方法應(yīng)該是大部分朋友們首先會(huì)想到的方法。這個(gè)方法當(dāng)然肯定可行,因?yàn)楣P者以前就這樣干過(guò)。我把曾經(jīng)寫(xiě)過(guò)的腳本改造下貼出來(lái),您看看多麻煩:
--定義變量declare @pos bigint=1;declare @len bigint;declare @char nvarchar(1);declare @text nvarchar(max);declare @val varchar(max)=space(0);declare @count bigint=0;--初始化一些變量set @text=N"印度囂張、越南陰險(xiǎn)、美國(guó)霸道、中國(guó)低調(diào)、、、";set @len=len(@text);--統(tǒng)計(jì)“、”出現(xiàn)個(gè)數(shù)while @pos<=@len begin --將所有的部分循環(huán)完全 set @char=substring(@text,@pos,1) if @char="、" set @count+=1; set @pos=@pos+1 --end--顯示個(gè)數(shù)print @count;
上面的代碼段,主要用來(lái)統(tǒng)計(jì)字符串@text中包含的“、”的個(gè)數(shù),下圖是執(zhí)行的效果:
為了統(tǒng)計(jì)“、”的個(gè)數(shù),需要通過(guò)while循環(huán),將字符串中所有字符做一次遍歷,獲取每個(gè)位置字符使用的是substring函數(shù),通過(guò)變量@pos記錄當(dāng)前字符的位置,循環(huán)一次,該變量累加1表示位置后移一位。
這種方法雖然挺復(fù)雜,但所用到的都是SQL的基礎(chǔ)知識(shí),當(dāng)然也需要一定的SQL功底,不管您喜不喜歡,最起碼您要能看得懂這類代碼對(duì)吧。
這種方式除了麻煩,還有致命缺點(diǎn),比如,有時(shí)我們需要在某條SQL腳本中、根據(jù)某個(gè)字段中含有某個(gè)字符的個(gè)數(shù)來(lái)做排序或判斷,這種方法就麻煩了,您需要寫(xiě)成自定義函數(shù)調(diào)用才行。
世上本無(wú)事、庸人自擾之,我下面為您提供一種變通方式,一條腳本實(shí)現(xiàn)之。
變通方法需要靈活變通,需要您換換思考的方式!正向思維中,查找字符串中包含的某個(gè)字符的個(gè)數(shù),當(dāng)然是通過(guò)遍歷挨個(gè)對(duì)比。其實(shí)我們可以采用逆向思維:如果我們把要找的字符從字符串中全部干掉,那字符串減少的長(zhǎng)度不就是包含的個(gè)數(shù)么?!
如何干掉待查找字符呢?這就要用到另一個(gè)字符串處理函數(shù)replace。腳本如下:
declare @text nvarchar(max)=N"印度囂張、越南陰險(xiǎn)、美國(guó)霸道、中國(guó)低調(diào)、、、";select len(@text)-len(replace(@text,"、",space(0)));
簡(jiǎn)單吧,我們使用字符串長(zhǎng)度減去替換成space(0)之后的長(zhǎng)度,不正是“、”出現(xiàn)的次數(shù)么?
下面是運(yùn)行效果:
與第一種方法相比,第二種方法可謂是簡(jiǎn)單快捷、殊途同歸。很多時(shí)候我們需要將結(jié)果嵌入在SQL中,比如在where條件中、排序時(shí)等,如果用到該個(gè)數(shù)做判斷或排序,您就只能用第二種方法、或者將第一種腳本改成自定義函數(shù)來(lái)調(diào)用了。
1.《字符統(tǒng)計(jì) SQL如何統(tǒng)計(jì)字符出現(xiàn)次數(shù)?》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《字符統(tǒng)計(jì) SQL如何統(tǒng)計(jì)字符出現(xiàn)次數(shù)?》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/486965.html