2009-12-01 77 views
0

我有一列的表,看起來像這樣:分割字符串返回記錄

Gaming | Austria | 47.9333, 15.1 
Hebei | China | 39.8897, 115.275 

這意味着,每一行是一個包含了一些位置,一個字符串(VARCHAR),由一個分隔的不同字段管道(|)。

我想編寫一個返回下面的查詢:

------- ---------- --------------------------------- 
Gaming Austria Gaming | Austria | 47.9333, 15.1 
Hebei China  Hebei | China | 39.8897, 115.275 

這意味着我要3列:爲城市,爲國家和原始列。

雖然拆分城市很簡單(CHARINDEX和SUBSTRING的結合),但提取國家似乎更具挑戰性。棘手的部分是要知道字符串中country字段的長度,所以可以使用SUBSTRING來提取它。

我意識到我可能不得不在T-SQL中編寫SPLIT函數,但我不確定如何編寫一個將數據作爲記錄返回而不是作爲表返回的函數。

提示和/或解決方案將更受歡迎。

+3

呃,這是可怕的表設計:(希望你可以改變它在某些時候 – 2009-12-01 15:50:11

+0

是啊,肯定很抱歉聽到你必須使用該 – 2009-12-01 15:52:48

回答

2

指定相應的起始位置,並基於字符串中的分隔符的位置動態計算長度早晚的事情 - 爲d。上面展示了一些額外的調整:

select substring(fieldName,0,charindex('|',fieldName,0)) as city, 
     substring(fieldName,charindex('|',fieldName,0)+1,(charindex('|',fieldName,(charindex('|',fieldName,0)+1)) - charindex('|',fieldName,0) - 1)) as country, 
     right(fieldName, charindex('|',reverse(fieldName),0)-1) as coordinates 

請注意,您可能需要使用基於CLR的分割功能,以及多種它們在this other serverfault thread所概述的其他可能性進行比較。

+0

非常感謝,CHARINDEX操作是我錯過的部分。 – Moshe 2009-12-01 16:11:43

0

您可以傳遞第三個參數,該參數指定要開始查找的第一個字符。這意味着你可以提取的國家是這樣的:

CHARINDEX(field, '|', CHARINDEX(field, '|')+1) 
+0

謝謝。但是,這將返回索引,而不是SUBSTRING所需的長度 – Moshe 2009-12-01 15:50:16

+0

嗯,是的,這會給你關於你需要傳遞給子串的參數的信息,我得到的印象是你已經知道如何處理這個部分 – 2009-12-01 15:58:58

+0

你說得對,我確實。那些CHARINDEX調用讓我困惑得太多。在板上繪製字符串幫助我了。:) – Moshe 2009-12-01 16:15:03