2013-12-11 1 views
0

У меня есть тысячи записей, которые являются бизнес-имена и адреса, натянутые вместе в одном поле (NameAddress):Замену выражения в CHARINDEX и LEN со значениями в другой таблице

Microsoft 1 157th Ave NE Redmond WA 98052 
Apple Inc 1 Infinite Loop Cupertino CA 95014 
Kraft Beton GmbH Industriestraße 123 1220 Wien 
Pletzenauer Holzbau GmbH Moosnerweg 9 6382 Kirchdorf in Tirol 

Я хотел бы разобрать города в свои поля. У меня есть запрос, который делает это хорошо, но буду работать только для одного города в то время:

CASE WHEN CHARINDEX('wien',NameAddress) > 0 THEN 
SUBSTRING(NameAddress,(CHARINDEX('wien',NameAddress)),LEN('wien')) ELSE '' END 
AS City 

У меня есть таблица dbo.geography, содержащие имена всех этих городов. Можно ли использовать значения в этой таблице как выражение в командах CHARINDEX и LEN в моем предыдущем запросе?

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

ответ

1

Этот запрос даст вам список NameAddress и City из geography таблицы, если она существует в NameAddress

select a.NameAddress, ISNULL(g.City, '') 
from address a 
left join geography g 
    on CHARINDEX(g.City, a.NameAddress) > 0 

SQL Fiddle demo

BTW, это будет хорошо работать для реальных адресов? Что, если название города указано в названии улицы?

+0

Чтобы уменьшить количество ложных срабатываний, вы можете добавить пробел до и после имени города при вызове CHARINDEX. Предполагая, что название города всегда находится в середине адреса (никогда в конце), это было бы похоже на поиск «всего слова». – acfrancis

+1

Спасибо большое! Ваши ответы отлично работали. Теперь мне нужно вырвать имя с начала строки, и я думаю, что мне нужен другой подход. Я знаю, что можно создать подстроку всех символов, ведущих до определенной точки, т. Е. «Inc.». Можно ли сделать это по нескольким критериям, например, Inc. или Corp. или ООО и т. Д.? У меня есть все типы бизнес-объектов, хранящиеся в отдельной таблице. – gnarkill619

+0

Да, это возможно. Думаю, вы можете использовать аналогичный подход, как указано выше. – Szymon