Разделенная строка, возвращающая запись - PullRequest
0 голосов
/ 01 декабря 2009

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

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, но я не уверен, как написать такую, которая возвращает данные как запись, а не как таблицу.

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

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Просто вопрос определения подходящей начальной позиции и динамического вычисления длины на основе положений разделителей в строке - как 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, а также с рядом других возможностей, описанных в этом другом потоке с ошибками сервера .

0 голосов
/ 01 декабря 2009

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

CHARINDEX(field, '|', CHARINDEX(field, '|')+1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...