在資料庫開發過程中,字串和關係表的轉化是一項基本技能。當字串中存在分隔符時,有時將其轉換成關係表資料,和其他資料表進行join查詢,出現這種情況,是因為沒有遵守關聯式資料庫的設計正規化,沒有把字串拆分成原子項儲存,也有可能是資料傳引數;有時會遇到相反的情況,需要將關係表的相關資料拼接成乙個字串顯示,或傳參。
把格式化的字串轉化成關係格式,基本思路分為兩種:
把關係格式轉化成字串,基本思路分為兩種:
一,將字串轉換成表
先把字串轉換成xml格式,再利用xml的nodes()函式,把xml資料轉化成關係資料,這種實現方式效能快,**簡潔,
declare@separator
varchar(10
)declare
@str
varchar(max
)
set@separator='
,'set@str='
54,57,55,56,59
'
1,把字串轉化成節點值
每個子串都是節點值,只需要取出節點值,就可以把節點值轉化成關係格式的列值
declare@xml
xmlset
@xml
=convert(xml,''+
replace(@str, @separator, '
') +''
)select ids=n.v.value('
.', '
int'
) from
@xml.nodes('
/v') n(v)
2,把字串轉化成節點屬性
每個子串都是節點的屬性值,只需要取出節點的屬性值,就可以把屬性值轉化成關係格式的列值
declare@xml
xmlset
@xml
=convert(xml,'
'''+
replace(@str, @separator, '''
>
''') +
'''>')
select ids=n.v.value('
@v', '
int'
) from
@xml.nodes('
/item
') n(v)
3,內建錶值函式(string_split)
sql server 2016 新增乙個錶值函式string_split,用於按照分隔符將字串分割成表值資料,返回的欄位名是value
string_split ( string , separator )
二,將表資料拼接成字串
有以下資料表,有兩列:id和txt,id值有重複,而txt是文字資料;
createtable
dbo.test
(id
int,
txt
varchar(10
))
把id欄位相同的txt欄位的值拼接成字串顯示
selectid ,(
select a.txt+
''from dbo.test a where a.id=t.id for xml path('')) as
descr
from
dbo.test t
group
by id
三,奇巧淫技
在master資料庫中,存在乙個系統檢視:master.dbo.spt_values,該檢視包含從0到2047的所有數字,利用這個特性,可以把特定長度的字串轉化成關係格式,實現的**如下:
;with cte_numbers as(
select
number
from
master.dbo.spt_values
where type='p
'and
number
>0)
select
cast(substring(@str, n.number, charindex(@separator ,@str
+@separator ,n.number )-n.number) as
nvarchar(4000)) as
item
--,n.number
from
cte_numbers n
where n.number
<=
len(@str)+
1and
charindex(@separator,@separator
+@str,n.number)=n.number
對於該方法,要體會其**的思路,通過資料序列,從數字1開始,逐個檢測分隔符,對字串進行分割操作,擷取子字串,從而把字串轉化成關係表;由於master.dbo.spt_values只有0到2047個順序數字,在必要時,可以替換該系統檢視,而使用自定義的資料序列表,以增加能夠拆分的字串長度。
在資料庫開發中,實現字串和關係格式的相互轉化,我傾向於使用面向集合的查詢,通過面向過程的程式設計思想來實現,思路直接,比較簡單,在此就不再贅述了。
why (and how) to split column using master..spt_values?
字串和關係格式的轉化
在資料庫開發過程中,字串和關係表的轉化是一項基本技能。當字串中存在分隔符時,有時將其轉換成關係表資料,和其他資料表進行join查詢,出現這種情況,是因為沒有遵守關聯式資料庫的設計正規化,沒有把字串拆分成原子項儲存,也有可能是資料傳引數 有時會遇到相反的情況,需要將關係表的相關資料拼接成乙個字串顯示,...
python 字串 時間格式的轉化
獲取現在時間 nowtime datetime.datetime.now strftime y m d 1 先將2019年3月8日轉換成字元型2019 3 8,再轉換成時間格式 方法1 import datetime time 2019年3月8日 datetime.datetime.strptime...
把某種格式的字串轉化為駝峰字串
import org.junit.test public class solution 將給定字串 border left color轉換成駝峰寫法為borderleftclor public string hump string str 把字串根據格式拆分出string陣列 string stra...