2009-12-01 2 views
0

У меня есть один столбец таблицы, которая выглядит следующим образом:Split строка возвращает запись

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), извлечение страны кажется более сложной задачей. Трудная часть состоит в том, чтобы знать длину поля страны в строке, поэтому ее можно извлечь с помощью SUBSTRING.

Я понимаю, что мне, возможно, придется написать функцию SPLIT в T-SQL, но я не уверен, как написать тот, который возвращает данные как запись, а не как таблицу.

Подсказки и/или решения будут более чем приветствуются.

+3

Ugh, это ужасный дизайн стола :(Надеюсь, вы сможете изменить его в какой-то момент. –

+0

да, определенно жаль слышать, что вам нужно работать с этим –

ответ

2

Просто вопрос с указанием соответствующего исходного положения и динамически вычисления длины на основе положений разделителей в пределах строки - как д. показывает выше с некоторой дополнительной тонкой настройки:

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

0

Вы можете передать третий параметр, определяющий первый символ, с которого нужно начинать поиск. Это означает, что вы можете извлечь страну, как это:

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

Спасибо, но это вернет индекс, а не длину, требуемую SUBSTRING – Moshe

+0

ну да, это даст вам информацию о том, какие параметры вам нужно передать подстроке. У меня сложилось впечатление, что вы знали, как справиться с этой частью уже –

+0

Вы правы, я знаю. По какой-то причине все эти вызовы CHARINDEX путали меня со слишком большим количеством чисел. Рисование строки на доске помогло мне. :) – Moshe