拆分字符串返回记录

时间:2009-12-01 15:44:45

标签: sql-server tsql

我有一个列表,如下所示:

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函数,但是我不知道如何编写一个将数据作为记录而不是表格返回的函数。

提示和/或解决方案将非常受欢迎。

2 个答案:

答案 0 :(得分: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中列出的各种其他可能性进行比较。

答案 1 :(得分:0)

您可以传递第3个参数,该参数指定要开始查找的第一个字符。这意味着你可以像这样提取国家:

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