2013-06-25 2 views
3

У меня есть таблица с именем Houses на базе базы данных sql, в которой есть столбец, содержащий (датские) адреса. В Дании название улицы всегда приходит до номера дома, а затем информация о квартире, если это квартира. Я хочу разделить название улицы и номер на две строки и игнорировать информацию о квартире. Мои данные выглядит следующим образом:Разделение адресной строки в SQL

Address 
Fisker Vejen 48B, 1.TV 
Baunevej 29 

Таким образом, некоторые названия улиц имеют более чем 1 слово, а некоторые имеют информацию Адреса, телефоны квартиры, а некоторые нет. Некоторые номера домов также имеют нечисловые символы. Я хочу, чтобы это было:

Street_Name  House_Number 
Fisker Vejen  48B 
Baunevej   29 

Я могу извлечь название улицы со следующим кодом:

select case when a.NumStart> 0 then LEFT(a.Address,a.NumStart-1) ELSE a.Address END as Street_Name, 
    FROM 
    (select patindex('%[0-9]%',Address) as [NumStart], Address from Houses) a 

, но я не могу получить номер дома без информации пола. Может ли кто-нибудь помочь?

Спасибо!

+0

** '' ** всегда будет между номером улицы и информации квартиры? –

+0

Да, но номер улицы может содержать и нечисловой символ. Я только что обновил вопрос. – Mace

ответ

2

Вот решение:

SELECT * 
     ,LEFT(Address,PATINDEX('% [0-9]%',Address)-1)'Street' 
     , SUBSTRING(Address,PATINDEX('% [0-9]%',Address)+1,PATINDEX('%[0-9],%',Address+ ',')-PATINDEX('% [0-9]%',Address))'House Number' 
FROM T 

Демо: SQL Fiddle

UPDATE: Если номер дома всегда начинается с цифр и сопровождается запятой или вообще ничего не будет, то это будет работать:

SELECT * 
     ,LEFT(Address,PATINDEX('% [0-9]%',Address)-1)'Street' 
     , SUBSTRING(Address,PATINDEX('% [0-9]%',Address)+1,PATINDEX('%, %',Address+ ', ')-PATINDEX('% [0-9]%',Address)-1)'House Number' 
FROM Table1 

Demo2: SQL Fiddle2

+0

Он почти работает. Это не совсем общее, так как адрес может быть «Fisker Vejen 48B, 1.TV», и я хотел бы, чтобы номер был '48B'. – Mace

+0

Обновлено для размещения, если оно еще слишком жесткое, вам может понадобиться логика case. –

0

попробовать что-то вроде этого:

SELECT 
    CASE WHEN a.NumStart> 0 then LEFT(a.Adresse, a.NumStart-1) ELSE a.Adresse END as Vejnavn, 
    Substring(a.adress, a.Numstart, a.Comma - a.Numstart + 1) as HouseNumber 
FROM (
    SELECT 
    PATINDEX('%[0-9]%', Adress) as [NumStart], 
    CHARINDEX(',', Adress + ',') as Comma, 
    Adresse, 
    Salgsdato 
    FROM Houses) a 
1
SELECT 
    Vejnavn, 
    case when NumEnd > 0 then left(rest,NumEnd-1) else rest end Housenumber 
FROM ( 
    SELECT 
    *, 
    patindex('%[^0-9A-Z]%',rest) numend 
    FROM (
    SELECT 
     CASE WHEN a.NumStart> 0 THEN LEFT(a.Adresse,a.NumStart-1) ELSE a.Adresse END as Vejnavn, 
     CASE WHEN a.NumStart> 0 THEN SUBSTRING(a.Adresse,a.NumStart,100) ELSE '' END rest 
    FROM (
     SELECT 
     PATINDEX('%[0-9]%',Adresse) AS [NumStart], 
     Adresse 
     FROM Houses 
    ) a 
    ) b 
) c 

sqlfiddle

+0

Мой пример был ошибочным, так как я забыл упомянуть, что номера домов могут содержать нечисловые символы, такие как '48B', и в этом случае я хочу, чтобы число было' 48B', а не '48'. – Mace

+0

Отредактировано для подбора писем –

Смежные вопросы