2010-07-21 3 views
3

Извинения за нечеткое название ...Мне нужна помощь, разделяющая адреса (номер, дополнение и т. Д.)

Моя проблема в этом; У меня есть таблица SQL Server с около 100 000 записей. У каждого человека есть адрес, что-то вроде «Nieuwe Prinsengracht 12 - III». Теперь клиент хочет отделить улицу от числа и добавления (поэтому каждый адрес становится двумя или тремя полями). Проблема в том, что мы не можем быть уверены в формате, в котором находится текущий адрес, он также может просто быть чем-то вроде «Velperweg 30».

Единственное, что мы знаем об этом, это то, что это фрагмент текста, за которым следует число, возможно, за которым следует еще какой-нибудь текст (который может содержать число).

Возможное решение состоит в том, чтобы сделать это с помощью регулярных выражений, но я бы очень (много, много) сделал это с помощью запроса. Есть ли способ использовать регулярные выражения в запросе? Или у вас есть другие предложения, как решить такую ​​проблему?

+2

Это не пустая проблема, так как, вероятно, будут некоторые адреса (в каком-то нечетном формате), которые не соответствуют вашей структуре. Вы хоть представляете, насколько чисты ваши данные? – Paddy

+2

Я бы отозвался к клиенту по этому поводу, это большая работа для абсолютно никакой пользы. Спросите их, почему они хотят это сделать, какую выгоду они ожидают, за исключением целых потраченных денег? – HLGEM

+0

@HLGEM: Я не согласен - адрес должен был быть смоделирован как отдельные поля в первую очередь. Реально люди имеют несколько адресов - работают, как минимум, дома. –

ответ

3

Что-то вроде этого, может быть?

SELECT 
    substring([address_field], 1, patindex('%[1-9]%', [address_field])-1) as [STREET], 
    substring([address_field], patindex('%[1-9]%', [address_field]), len([address_field])) as [NUMBER_ADDITON] 
FROM 
    [table] 

Он основан на предположении, что [улица] поле не будет содержать каких-либо цифр, и [number_addition] поле будет начинаться с цифры.

+0

Спасибо, это выглядит многообещающе, я попробую это завтра! –

+0

Это работает очень хорошо! Думаю, с этим я смогу справиться. Обратите внимание, что у вас есть синтаксические ошибки в запросе, и подстроки имеют один «)» слишком много в конце. –

4

SQL Server и T-SQL довольно ограничены в своей обработке - если вы действительно серьезно относитесь к тяжелой лифтингу и регулярным выражениям и т. Д., Лучше всего, вероятно, создать сборку на C# или VB.NET, что делает все это сложное дело Regex, а затем развертывает его в SQL-CLR и использует функции в T-SQL.

«Чистый» T-SQL не может справиться с большим количеством манипуляций строк за пределами SUBSTRING и CHARINDEX - но это все.

+0

+1: Но вы забыли о [PATINDEX] (http://msdn.microsoft.com/en-us/library/ms188395.aspx), который [имеет ограниченное совпадение с шаблонами] (http://msdn.microsoft.com /en-us/library/ms187489.aspx) –

+0

@OMG Пони: хорошо, я даю вам «очень ограниченный» образец соответствия :-) –

+0

Да, это, кажется, самый лучший вариант ... Спасибо, я думаю, что буду попытайтесь сделать что-то подобное. –

0

Это звучит как обычный «возьмите кусок сложного текста, который может выглядеть как что угодно и сделать его похожим на то, что мы теперь хотим, чтобы он выглядел как« проблема ». Они, как правило, очень трудно сделать, используя только T-SQL (который не имеет встроенных функций регулярного выражения). Вероятно, вам придется работать с сложным кодом вне базы данных для решения этой проблемы.

1

В ответ на ваш вопрос «Есть ли способ использовать регулярные выражения в запросе?», Тогда да, но это требует небольшого знания .NET. Создайте сборку CLR с пользовательской функцией, которая работает с вашим регулярным выражением. Visual Studio 2008 имеет проект шаблона для этого. Разверните его на свой SQL-сервер и вызовите его из вашего запроса.

+0

+1: Почему это было отмечено? Это правильно - на SQL Server 2005+ SQLCLR является средством получения регулярных выражений, которые TSQL никогда не будет поддерживать. –

1

Анализ и стандартизация имен и адресов, вероятно, является одной из самых сложных проблем, с которыми мы можем столкнуться как программисты именно по причинам, о которых вы упомянули.

Я предполагаю, что кто бы вы ни работали для их основного бизнеса, это не разбор партов. Мой совет - купить решение, а не построить свой собственный.

Я знакомлюсь с this company. Примеры ваших адресов выглядят не в США или Канаде, поэтому я не знаю, будут ли их продукты полезными, но они могут указать вам другого поставщика.

Другие пользователи, не являющиеся пользователями своих продуктов, не связаны ни с кем.

0

TGnat верен. Стандартизация адреса сложна.

Я столкнулся с этой проблемой раньше.

Если ваш клиент не хочет весны для пользовательского программного обеспечения, разработайте простой графический интерфейс, который позволяет человеку принять адрес и разбить его вручную. Вы удалите строку адреса со старым форматом и вставьте строку в новый формат адреса.

Для машинисток, знакомых с вашими адресами, не потребуется много времени, чтобы вручную внести 100 000 изменений. Конечно, это зависит от клиента, если он хочет тратить деньги на специализированное программное обеспечение или машинистки.

Но вы также не должны зацикливаться на счете за очистку данных.

0

Я понимаю, что это старый вопрос, но для дальнейшего использования я все же решил добавить ответ с помощью регулярного выражения (также я не забыл его сам). Сегодня я столкнулся с аналогичной проблемой в Excel, в которой мне пришлось разделить адрес на улице и номер дома. В конце концов, я скопировал столбец SublimeText (условно-бесплатный текстовый редактор), и использовать регулярные выражения, чтобы сделать работу (CTRL-H, включите регулярное выражение):

FIND: ^('?\d?\d?\d?['-\.a-zA-Z ]*)(\d*).*$ 
REPLACE FOR THE HOUSE NUMBER: $2 
REPLACE FOR THE STREET NAME: $1 

Некоторые примечания:

  • Некоторые адреса начинаются с цитирования, например «Хофье, поэтому мне нужно было добавить»?
  • Некоторые адреса содержат цифры в начале, например. 17 Septemberplein или 2e Molendwarsstraat, поэтому я добавил \ d? \ D? \ D?
  • Некоторые адреса содержали: -, например. Willem-Alexanderlaan или a '
Смежные вопросы