2010-10-16 5 views
2

Я должен удалить следующее из поля адреса.Найти и заменить строку на сервере sql 2005

  1. Замените все слова, названные «плоскими» на пустое место, также удалите число, которое приходит вместе с ним.

eg. У меня слово называется «Flat 234 5th Street».

Его следует заменить на 5-ю улицу.

Я дал запрос в

select 
    ltrim(rtrim(substring ('Flat 123 5th Street', charindex('Flat ','Flat 123 5th Street') + 5, len ('Flat 123 5th Street')))) 

Он вернулся

123 5th Street

Теперь я должен найти ли до следующего появления пространства, у меня есть числовое значение или нет.

Если числовое, то удалите его, иначе оставьте его.

Может кто-нибудь помочь пожалуйста.

С уважением, Хема

Да Marc_S, я должен был сделать это (под редакцией). Я не могу делать ни на одном другом языке. Предполагается делать только в T-SQL.

Hi LittleBobbyTales, спасибо за ответ. На самом деле это не стандартный формат, я мог бы только Flat 123

или Flat 123 пятого 1st Street Main Road

или первый Main Flat 1

Там нет правила, что мы будем иметь 1 номер или 2 числа после слова Flat. Возможно, что номера могут быть или не быть.

Это может быть в любом случае.

+0

Если вы разместите код или XML, ** пожалуйста ** выделить эти строки в текстовом редакторе и нажмите на кнопку «код» (101 010) на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис! –

+0

Звучит как идеальное совпадение для регулярного выражения - к сожалению, язык запросов SQL-SQL T-SQL на самом деле не очень силен при сопоставлении строк/регулярных выражений. Вы бы лучше сделали это на традиционном языке программирования, таком как C# или что-то ... –

+0

Согласитесь с marc_s, но из любопытства вы можете привести больше примеров полей адресов, которые нужно проанализировать? – LittleBobbyTables

ответ

2

Вы можете использовать функцию скаляра, чтобы вырезать плоскую часть. Трудная часть состоит в том, как проверить, является ли слово числом: @word like '%[^0-9]%' делает это, ища персонажа, который не 0-9. Полный пример:

if OBJECT_ID('fn_StripFlat') is not null 
    drop function fn_StripFlat 
go 
create function dbo.fn_StripFlat(
    @street varchar(150)) 
returns varchar(150) 
as begin 
    declare @word varchar(150) 
    declare @result varchar(150) 
    declare @cur int 
    declare @next int 
    declare @in_flat bit 

    set @cur = 1 
    while 1=1 
     begin 
     set @next = CHARINDEX(' ', @street, @cur) 
     if @next = 0 
      set @word = SUBSTRING(@street, @cur, len(@street) - @cur + 1) 
     else 
      set @word = SUBSTRING(@street, @cur, @next - @cur) 

     if @word = 'flat' 
      begin 
      set @in_flat = 1 
      end 
     else if @word like '%[^0-9]%' 
      begin 
      set @in_flat = 0 
      set @result = IsNull(@result + ' ','') + @word 
      end 

     if @next = 0 
      break 
     set @cur = @next + 1 
     end 
    return IsNull(@result,'') 
end 
go 

Код испытания:

declare @Streets table (street varchar(150)) 
insert @Streets 
      select 'Flat 234 5th Street' 
union all select 'Flat 123 456 5th Street 1st Main Road' 
union all select '1st Main Flat 1' 
union all select '5th Street 1st Main Road' 
union all select 'FlatStreet' 
union all select '' 

select street 
,  dbo.fn_StripFlat(street) 
from @Streets 

Это печатает:

Flat 234 5th Street      5th Street 
Flat 123 456 5th Street 1st Main Road 5th Street 1st Main Road 
1st Main Flat 1       1st Main 
5th Street 1st Main Road    5th Street 1st Main Road 
FlatStreet        FlatStreet 
Смежные вопросы