朋友們,我們在寫SQL腳本時,經常會碰到一些個看似簡單、卻無從下手的問題,這類問題說大不大、說小也不小,經常會搞的我們很頭痛。
比如,如何使用SQL語句統計字符在某個字符串中出現的次數?這就是個看似簡單的問題,遍查SQL支持的字符串函數(至少在MSSQL中),并沒有發現有直接可用的函數。
其實,絕大部分情況下,只要我們學會了變通,很多讓我們苦惱的問題很容易就迎刃而解了。不信請您往下看。
不變通也能解決問題,雖然復雜,但用到的技術都是基本功
因為沒有相應的內置函數,大部分朋友首先想到的是:把整個字符串按照字符位置遍歷,一個個匹配。這種方法應該是大部分朋友們首先會想到的方法。
這個方法當然肯定可行,因為筆者以前就這樣干過。我把曾經寫過的腳本改造下貼出來,您看看多麻煩:
--定義變量 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'印度囂張、越南陰險、美國霸道、中國低調、、、'; set @len=len(@text); --統計“、”出現個數 while @pos<=@len begin --將所有的部分循環完全 set @char=substring(@text,@pos,1) if @char='、' set @count+=1; set @pos=@pos+1 -- end --顯示個數 print @count;
上面的代碼段,主要用來統計字符串@text中包含的“、”的個數,下圖是執行的效果:
為了統計“、”的個數,需要通過while循環,將字符串中所有字符做一次遍歷,獲取每個位置字符使用的是substring函數,通過變量@pos記錄當前字符的位置,循環一次,該變量累加1表示位置后移一位。
這種方法雖然挺復雜,但所用到的都是SQL的基礎知識,當然也需要一定的SQL功底,不管您喜不喜歡,最起碼您要能看得懂這類代碼對吧。
這種方式除了麻煩,還有致命缺點,比如,有時我們需要在某條SQL腳本中、根據某個字段中含有某個字符的個數來做排序或判斷,這種方法就麻煩了,您需要寫成自定義函數調用才行。
世上本無事、庸人自擾之,我下面為您提供一種變通方式,一條腳本實現之。
變通方法需要靈活變通,需要您換換思考的方式!
正向思維中,查找字符串中包含的某個字符的個數,當然是通過遍歷挨個對比。其實我們可以采用逆向思維:如果我們把要找的字符從字符串中全部干掉,那字符串減少的長度不就是包含的個數么?!
如何干掉待查找字符呢?這就要用到另一個字符串處理函數replace。腳本如下:
declare @text nvarchar(max)=N'印度囂張、越南陰險、美國霸道、中國低調、、、'; select len(@text)-len(replace(@text,'、',space(0)));
簡單吧,我們使用字符串長度減去替換成space(0)之后的長度,不正是“、”出現的次數么?
下面是運行效果:
與第一種方法相比,第二種方法可謂是簡單快捷、殊途同歸。很多時候我們需要將結果嵌入在SQL中,比如在where條件中、排序時等,如果用到該個數做判斷或排序,您就只能用第二種方法、或者將第一種腳本改成自定義函數來調用了。