sql 語句系列(字符串的遍歷嵌入刪除與統計)[八百章之第十一章]

遍歷字符串

我以爲首先要提出一個疑問:
一個數據庫自己就是用於存儲的,遍歷字符串究竟有何意義?
先看如何實現的,畢竟sql service 是沒有for循環,也沒有loop和while的。sql

select SUBSTRING(e.ENAME,t.ID,1) as sub
from emp e,T10 t
where e.ENAME='JONES' and t.ID<=len(e.ENAME)


的確是遍歷了這個字符串JONES.數據庫

原理也十分的簡單:oracle

select * from T10

T10 能夠當作一個索引集,利用一個笛卡爾積的特性實現的。函數

加入不是去附加額外的條件:oop

select e.ENAME,t.ID

from emp e,T10 t

where e.ENAME='JONES'

這就是它的一個簡單原理。學習

回到業務層面,去數據庫遍歷一個字符串那麼自己就不能夠,由於數據庫不是去計算層面的東西。3d

通常可用於用戶的一些常規性,基本穩定的字段。code

咱們在查詢一個記錄的時候若是加上top 1,那麼效率最高,由於不須要去遍歷整張表。blog

因此好比用戶的一些配置表示這樣的:id(用戶id) usersetting(某類用戶特性).
舉例而言:5 xxx,xxx,xxx,xxx,xxx,xxx
後面的xxx,xxx,xxx,xxx,xxx,xxx,是對應的另一張表的主鍵,這張表的主鍵的id是生成的惟一id且長度相等。
那麼就能夠經過遍歷的方式,查詢出用戶的具體特性。
下面這種:索引

select *
from xxx
where yy in
(select e.ENAME,t.ID

from emp e,T10 t

where e.ENAME='JONES' )

因爲本身水平的限制,這是我惟一遇到的狀況,其餘的狀況也沒趕上過。但願有人能夠補充更加實用的例子,在此等待學習。

嵌入引號

這裏只是接受兩個''是一個引號,若是隻有''爲空,有點繞,看例子。

select 'g''day mate'  from t1

select ''  from t1

統計字符串出現的個數

一般每每必定,咱們用的是正則,可是又碰巧sql service沒有正則,這就巧了。

網上有一些文章寫sql service 使用正則的,都是基本經過通配符來實現的。
這個就不須要這麼麻煩了。

select (len('xxxx,xxxx,xxxx')-len(REPLACE('xxxx,xxxx,xxxx',',','')))/len(',')
from T1

這個例子我第一個例子相對應。

刪除不想要的字符

這個直接使用replace 函數替換便可,若是要替換幾個,那麼屢次使用。例子參考上文。

在oracle 中可使用 translate: replace(translate('你好啊 你好啊',"mm",'你啊'),'m')
上文translate把"你" "啊" 所有換成了m,而後刪除m便可。
translate 的第二個參數是每一位是和第三個參數的每一位相對應的。一個你,對應第一個m,第二個啊,對應第二個m,若是沒有即爲空。
在 sql service 2017之後:

select replace(translate('你好啊 你好啊','mm','你啊'),'m','')
from T1

分離數字和字符數據

和上面的一致,只是分離出數字後,須要用convert(int,'xxx') 轉換

select CONVERT(int,REPLACE(translate('dadsawx10','zzzzzzzzzzzzzzzzz','abcdefghijklmnopqrstuvwxyz'),'z','')) as number,REPLACE(translate('dadsawx10','0000000000','0123456789'),'0','') as str
from t1
相關文章
相關標籤/搜索