我以爲首先要提出一個疑問:
一個數據庫自己就是用於存儲的,遍歷字符串究竟有何意義?
先看如何實現的,畢竟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