我有一個SQL Server數據庫表具有以下的列:如何根據分隔符將字符串分成兩部分?
Field1, Field2, Field3
Field1
類型爲字符串的列「|」作爲分隔符。
它具有以下形式:
Part1|Part2
我想寫一個SQL查詢返回以下列:
Part1, Part2, Field2, Field3
什麼是做到這一點的最好方法是什麼?
我有一個SQL Server數據庫表具有以下的列:如何根據分隔符將字符串分成兩部分?
Field1, Field2, Field3
Field1
類型爲字符串的列「|」作爲分隔符。
它具有以下形式:
Part1|Part2
我想寫一個SQL查詢返回以下列:
Part1, Part2, Field2, Field3
什麼是做到這一點的最好方法是什麼?
這裏的一個選擇是利用SQL Server的基本字符串函數SUBSTRING()
和CHARINDEX()
將管道字符上的兩部分Field1
分開。
SELECT SUBSTRING(Field1, 1, CHARINDEX('|', Field1)-1) AS Part1,
SUBSTRING(Field1, CHARINDEX('|', Field1)+1, LEN(Field1)) AS Part2,
Field2,
Field3
FROM yourTable
讓我開始saing我完全同意Marc_s的評論 - 永遠不要將多個值存儲在一個列中。
欲瞭解更多信息,請閱讀Is storing a delimited list in a database column really that bad?,在這裏你會看到很多原因爲什麼這個問題的答案是絕對是!現在
,假設你不能更改數據庫的結構,這裏是charIndex
創建和填充示例表(請保存我們這一步在你未來做用Left
和Right
的一種方式問題)
DECLARE @T AS TABLE
(
Col varchar(10)
)
INSERT INTO @T VALUES
('a|b'),
('ab|cd'),
('abc|def'),
('abcd|efgh'),
('abcde|fghi')
查詢:
SELECT Col,
LEFT(Col, CHARINDEX('|', Col)-1) As Part1,
RIGHT(Col, LEN(Col) - CHARINDEX('|', Col)) As Part2
FROM @T
個
結果:
Col Part1 Part2
a|b a b
ab|cd ab cd
abc|def abc def
abcd|efgh abcd efgh
abcde|fghi abcde fghi
這種方法(除了是短期)的優點是,它不會失敗,如果管道失蹤。
SELECT
SUBSTRING(Field1, 0, charindex('|',Field1)) Part1,
STUFF(Field1,1,charindex('|',Field1),'') Part2,
Field2,
Field3
FROM (values('abc|def','val2','val3')) x(Field1, field2, Field3)
你應該***從來沒有***存儲多個值到一個列 - 這違反了連**第一範式**數據庫設計的,並會導致你無盡的悲傷和煩惱 - 只是不」 t do it –
這真的很簡單嗎? select replace('Part1 | Part2','|',',')Field1,'Field2'Field2,'Field3'Field3 – KumarHarsh