2009-12-01 80 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