在資料庫開發過程中,字串和關係表的轉化是一項基本技能。當字串中存在分隔符時,有時將其轉換成關係表資料,和其他資料表進行join查詢,出現這種情況,是因為沒有遵守關聯式資料庫的設計正規化,沒有把字串拆分成原子項儲存,也有可能是資料傳引數;有時會遇到相反的情況,需要將關係表的相關資料拼接成乙個字串顯示,或傳參。
把格式化的字串轉化成關係格式,基本思路分為兩種:
把關係格式轉化成字串,基本思路分為兩種:
一,將字串轉換成表
先把字串轉換成xml格式,再利用xml的nodes()函式,把xml資料轉化成關係資料,這種實現方式效能快,**簡潔,
declare1,把字串轉化成節點值@separator
varchar(10)
declare
@str
varchar(max)
set@separator='
,'set@str='
54,57,55,56,59
'
每個子串都是節點值,只需要取出節點值,就可以把節點值轉化成關係格式的列值
declare2,把字串轉化成節點屬性@xml xml
set@xml
=convert(xml,''+
replace(@str, @separator, '
') +'')
select ids=n.v.value('
.', '
int')
from
@xml.nodes('
/v') n(v)
每個子串都是節點的屬性值,只需要取出節點的屬性值,就可以把屬性值轉化成關係格式的列值
declare3,內建錶值函式(string_split)@xml xml
set@xml
=convert(xml,'
'''+
replace(@str, @separator, '''
>
''') +
'''>
')
select ids=n.v.value('
@v', '
int')
from
@xml.nodes('
/item
') n(v)
sql server 2016 新增乙個錶值函式string_split,用於按照分隔符將字串分割成表值資料,返回的欄位名是value
string_split ( string , separator )二,將表資料拼接成字串
有以下資料表,有兩列:id和txt,id值有重複,而txt是文字資料;
create把id欄位相同的txt欄位的值拼接成字串顯示table dbo.test
(id int,
txt varchar(10)
)
select id三,奇巧淫技,(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對於該方法,要體會其**的思路,通過資料序列,從數字1開始,逐個檢測分隔符,對字串進行分割操作,擷取子字串,從而把字串轉化成關係表;由於master.dbo.spt_values只有0到2047個順序數字,在必要時,可以替換該系統檢視,而使用自定義的資料序列表,以增加能夠拆分的字串長度。( 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
在資料庫開發中,實現字串和關係格式的相互轉化,我傾向於使用面向集合的查詢,通過面向過程的程式設計思想來實現,思路直接,比較簡單,在此就不再贅述了。
why (and how) to split column using master..spt_values?
作者:
悅光陰
分類:
sql server
標籤:
tsql,
字串
字串和關係格式的轉化
在資料庫開發過程中,字串和關係表的轉化是一項基本技能。當字串中存在分隔符時,有時將其轉換成關係表資料,和其他資料表進行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...