最近由於對資料庫的網域名稱要排重,因為sql直接使用起來方便一些,就整理下
a.擷取從字串左邊開始n個字元
declare @s1 varchar(100)
select @s1=''
select left(@s1,4)
------------------------------------
顯示結果: http
b.擷取從字串右邊開始n個字元(例如取字元www.cnblogs.com)
declare @s1 varchar(100)
select @s1=''
select right(@s1,11)
------------------------------------
顯示結果: www.cnblogs.com
c.擷取字串中任意位置及長度(例如取字元www)
declare @s1 varchar(100)
select @s1=''
select substring(@s1,8,3)
------------------------------------
顯示結果: www.cnblogs.com
以上例子皆是已知擷取位置及長度,下面介紹未知位置的例子
2.擷取未知位置的函式
a.擷取指定字串後的字串(例如擷取http://後面的字串)
方法一:
declare @s1 varchar(100)
select @s1=''
select substring(@s1,charindex('www',@s1)+1,len(@s1))
/*此處也可以這樣寫:select substring(@s1,charindex('//',@s1)+2,len(@s1))*/
------------------------------------
顯示結果: www.cnblogs.com
需要注意:charindex函式搜尋字串時,不區分大小寫,因此charindex('www',@s1)也可以寫成charindex('www',@s1)
方法二:(與方法一類似)
declare @s1 varchar(100)
select @s1=''
select substring(@s1,patindex('%www%',@s1)+1,len(@s1))
--此處也可以這樣寫:select substring(@s1,patindex('%//%',@s1)+2,len(@s1))
------------------------------------
顯示結果: www.cnblogs.com
函式patindex與charindex區別在於:前者可以引數一些引數,增加查詢的功能
方法三:
顯示結果: www.cnblogs.com
利用字元替換函式replace,將除需要顯示字串外的字元替換為空
方法四:
顯示結果: www.cnblogs.com
函式stuff與replace區別在於:前者可以指定替換範圍,而後者則是全部範圍內替換
b.擷取指定字元後的字串(例如擷取c:\windows\test.txt中檔名)
與a不同的是,當搜尋物件不是乙個時,利用上面的方法只能搜尋到第乙個位置
方法一:
declare @s1 varchar(100)
select @s1='c:\windows\test.txt'
select right(@s1,charindex('\',reverse(@s1))-1)
-------------------------------------
顯示結果: text.txt
利用函式reverse獲取需要擷取的字串長度
上面的這些方法能解決基本問題,但當本身資料庫中的網域名稱不是標準的網域名稱整體(例:
這個時候擷取的sql就要複雜點了,最終的關鍵還是在於善用 substring,charindex兩個函式,基本都可以解決
SQL 字元擷取
如題所示 在寫儲存過程當中常用到字元的擷取與同事總結了一下帖上來 code declare text nvarchar 20 sign nvarchar 20 content nvarchar 20 startindex int,findindex int,result nvarchar 30 初始...
SQL 擷取的另一種方法
有時候我們需要將如下結果集中的ids進行分割 ids 1,12,123 1 行受影響 希望得到這樣的結果 112 123 3 行受影響 之前一直用表值函式來擷取,這裡借助master.dbo.spt values表來實現 準備資料 if object id tempdb.a is notnull d...
sql語句拼接,字元擷取,sql排序
1 下面的語句會把,從t in 1表查詢的vinleft欄位進行去重,同理t vin 3 做同樣的處理,並且把兩個查詢的結果連在一起 select distinct vinleft from t vin 0 union select distinct vinleft from t vin 1 uni...