Как разделить предложение в SQL Server 2005 - PullRequest
1 голос
/ 19 октября 2010

У меня есть столбец с именем Адрес в таблице.У меня есть такие значения, как

12-15 Hardley Street    
2A-C Hardley Street    
A-2c Hardley Street    
A-B Hardley Street

Я должен сохранить дефис (-) без изменений в первых трех строках.

т.е. если в слове есть число, которое содержит дефис(-), я должен оставить его, иначе я должен заменить его пробелом.

Таким образом, столбец следует заменить, как показано ниже

12-15 Hardley Street    
2A-C Hardley Street    
A-2c Hardley Street    
A B Hardley Street

Мой маленький мозг не может этого понять.Любая помощь, пожалуйста.

PS: Я также хотел бы добавить, что нет необходимости, чтобы первое слово содержало дефис.

Данные могут быть как

Hardley Street 2A-C 

или

2A-C

Спасибо всем за ваш ответ и комментарии.

Был еще один предварительный условие, которое я должен сделать в запросе на обновление.

declare @data nvarchar(200)
set @data='12-12 ORANGE-RED'
select @data= 
    case left(@data,charindex(' ',@data))
        when '' then 
                CASE PATINDEX ('%[0-9]%',@data)
                    when 0 then replace(@data,'-',' ')
                    else @data
                END
        else 
                CASE PATINDEX ('%[0-9]%',left(@data,charindex(' ',@data)))
                    when 0 then replace(left(@data,charindex(' ',@data)),'-',' ')+'-- LEFT MOST WORD REPLACE'
                    else 
                        CASE charindex (' ',substring(@data,charindex(' ',@data)+1,len(@data)))
                            WHEN 0 THEN 
                                CASE PATINDEX ('%[0-9]%',substring(@data,charindex(' ',@data)+1,len(@data)))
                                    when 0 then left(@data,charindex(' ',@data))+ replace(substring(@data,charindex(' ',@data)+1,len(@data)),'-',' ') +'--RIGHT MOST REPLACE'
                                    else @data + '--struggling here'
                                END
                            END

                END
    end
where @data like '%-%'
select @data

Я пробовал вышеизложенное. Я буду обновлять таблицу как

update tblname set @columnName= 
    --lines of coding
where @columnName like '%-%'

Я не могу решить эту проблему, и, к сожалению, данные будут противоречивыми.

Я предположил, что данные состоят из двух слов, таких как

2A-C Hardley Street    
A-2c Hardley Street    
A B Hardley Street

Но клиент сказал, что он будет иметь данные как

  Hardley Street  22-23  BO'NESS
    A-2c Hardley Street    
    Hardley Street 12B Stratford-upon-avon

Я не могу создать функциюПричина в том, что мы собираемся обновить таблицу и отформатировать ее.Если я создаю функцию, которую я должен вызывать для каждой другой строки, которая отнимает много времени.

Пожалуйста, не предлагайте SSIS, поскольку это уже исключено.

Любые идеи будут оченьполезно.

Ответы [ 4 ]

2 голосов
/ 19 октября 2010

Это будет проще всего сделать при интеграции CLR и регулярных выражениях .

1 голос
/ 19 октября 2010

Это не та вещь, для которой был создан SQL. Подобная логика лучше обслуживается (и ее легче выполнять) на уровне приложений, если это возможно.

0 голосов
/ 19 октября 2010
create function ParseAddress(@Address varchar(255))
    returns varchar(255)
as
BEGIN
    declare @result varchar(255)
    declare @str varchar(255) 
    declare @i smallint
    declare @j smallint 
    declare @Separator char(1)

    set @Separator = ' '

    set @str = @Address 

    set @str = REVERSE(@str) 
    set @j = PATINDEX ('%[0-9]%',LEFT(@str,CHARINDEX(char(10),@str))) 

    if @j > 0 set @Separator = '-'

    set @i = PATINDEX ('%-%',@str)  

    set @result = REVERSE( LEFT(@str,@i-1) + @Separator + RIGHT(@str,LEN(@str) - @i)) 

RETURN @result
end
0 голосов
/ 19 октября 2010

Если вы разделяете данные пустым пространством, а в вашем первом столбце нет пустых мест, вы можете попробовать выполнить следующее:

    select 
     LEFT(a,charindex(' ',a)-1) as leftSide
    ,SUBSTRING(a,charindex(' ',a)+1,LEN(a)) as rightSide
from
(

select '12-15 Hardley Street    ' as a
union all
select '2A-C Hardley Street    '
union all
select 'A-2c Hardley Street    '
union all
select 'A-B Hardley Street'

) as a

Если у вас есть пустые места внутри левой стороны, вам следует более подробно описать правила добавленияданные, и, возможно, попробуйте использовать Regex, как упоминалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...