2015-10-14 3 views
1

Я просто хочу разбить колонку адреса, содержащую номер улицы и название улицы, на две колонки: номер улицы и название улицы. Номер улицы и имя разделяются пробелом в столбце адреса. Я использовал следующий скрипт, чтобы разделить адрес, который я передаю на 2 столбца, на основе разделителя пробелов.Разделение столбца на два

select left(Address, CHARINDEX(' ', Address)) as Street_Number, 
     substring(Address, CHARINDEX(' ', Address)+1, len(Address)-(CHARINDEX(' ', Address)-1)) as Street_Name 
from [dbo].XYZ 

Проблема в некоторых случаях у меня есть только адреса с названием улицы и в этом случае я хочу столбец номера улиц оставил пустой \ нуль.

+0

Я получаю столбец адреса из отдельной таблицы, а затем использовать код разделить на количество и название улиц колонны и магазин эти два столбца в другой таблице –

ответ

0

Это, как я обратился к нему. Я надеюсь, это поможет.

Создание базы данных TestDB перейти

USE TestDB GO --create Sample Таблица CustomerAddress создать таблицу CustomerAddress (Адрес полукокса (100)) пойти

вставки в значения CustomerAddress ('123 Main St ') Вставить в значения CustomerAddress (' XYZ St ') Вставить в значения CustomerAddress (' abc ')

выбрать * из Custome rAddress

--option # 1a - Сплит Адрес колонки, когда нет номер улицы замените пустое значение ВЫБРАТЬ
street_number = случай, когда (ISNUMERIC (ЛЕВЫЙ (Адрес, 1)) = 1), то ЛЕВЫЙ (адрес, CHARINDEX ('', Address)) ELSE '' END, Street_Name = CASE WHEN (ISNUMERIC (LEFT (Адрес, 1)) = 1) THEN подстрока (адрес, CHARINDEX ('', Address) + 1, len (Адрес) - (CHARINDEX ('', Address) - 1)) ELSE Адрес END FROM [dbo] .CustomerAddress;

--option # 1b - Сплит Адрес колонки, когда нет номер улицы не заменить NULL ВЫБРАТЬ
street_number = случай, когда (ISNUMERIC (ЛЕВЫЙ (Адрес, 1)) = 1) THEN ЛЕВЫЙ (Адрес, CHARINDEX ('', Address)) ELSE NULL END, Street_Name = CASE WHEN (ISNUMERIC (LEFT (Адрес, 1)) = 1) THEN substring (Адрес, CHARINDEX ('', Address) + 1, len (Address) - (CHARINDEX ('', Address) - 1)) ELSE Адрес END FROM [dbo] .CustomerAddress;

--option # 2a - Использование LIKE% вместо ISNUMERIC, мы можем получить более высокую производительность

ВЫБРАТЬ
street_number = случай, когда (адрес LIKE '[0-9]%') ТОГДА LEFT (Адрес, CHARINDEX (' ' адрес)) ИНАЧЕ NULL КОНЕЦ ,

STREET_NAME = случай, когда (Адрес LIKE '[0-9]%') ТОГДА подстроку (адрес, CHARINDEX ('', Адрес) + 1, LEN (Адрес) - (CHARINDEX ('', Address) - 1)) ELSE Адрес END FROM [dbo].CustomerAddress;

--clean вверх, понижая таблицу падения таблицы [DBO] .CustomerAddress пойти

+0

Пожалуйста, изучите, как отформатировать код в ответе, см. приведенный ниже ответ. Кроме того ... Добро пожаловать! – SQLMason

2

Один из способов:

;with t(Address) as (
    select '123 street lane' union all 
    select '12a lane' union all 
    select 'street lane' union all 
    select 'street' 
) 
select 
    Address, 
    case when Address like '[0-9]%' then 
     left(Address, charindex(' ', Address) - 1) 
    else 
     '' 
    end as Street_Number, 
    case when Address like '[0-9]%' then 
     substring(Address, charindex(' ', Address) + 1, len(Address)) 
    else 
     Address 
    end as Street_Name 
from t 

>> 

Address   Street_Number Street_Name 
--------------- --------------- --------------- 
123 street lane 123    street lane 
12a lane  12a    lane 
street lane      street lane 
street       street 
Смежные вопросы