2017-02-27 256 views
0

我有一個SQL Server數據庫表具有以下的列:如何根據分隔符將字符串分成兩部分?

Field1, Field2, Field3 

Field1類型爲字符串的列「|」作爲分隔符。

它具有以下形式:

Part1|Part2 

我想寫一個SQL查詢返回以下列:

Part1, Part2, Field2, Field3 

什麼是做到這一點的最好方法是什麼?

+1

你應該***從來沒有***存儲多個值到一個列 - 這違反了連**第一範式**數據庫設計的,並會導致你無盡的悲傷和煩惱 - 只是不」 t do it –

+0

這真的很簡單嗎? select replace('Part1 | Part2','|',',')Field1,'Field2'Field2,'Field3'Field3 – KumarHarsh

回答

1

這裏的一個選擇是利用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 
0

讓我開始saing我完全同意Marc_s的評論 - 永遠不要將多個值存儲在一個列中。
欲瞭解更多信息,請閱讀Is storing a delimited list in a database column really that bad?,在這裏你會看到很多原因爲什麼這個問題的答案是絕對是!現在

,假設你不能更改數據庫的結構,這裏是charIndex

創建和填充示例表(保存我們這一步在你未來做用LeftRight的一種方式問題)

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 
0

這種方法(除了是短期)的優點是,它不會失敗,如果管道失蹤。

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)