如何在SQL Server 2005中拆分句子

时间:2010-10-19 16:25:09

标签: sql sql-server sql-server-2005 tsql

我在表中有一个名为Address的列。 我有像

这样的价值观
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

我的小脑子无法理解这一点。 任何帮助请。

p.s:我还想补充一点,第一个单词不一定包含连字符。

数据可以是

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 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

这不是SQL构建的事情。如果可能的话,像这样的逻辑在应用层中更好地服务(并且更容易完成)。

答案 2 :(得分:0)

如果您使用空格分隔数据,并且您的第一列没有空格,您可以尝试按照

    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

答案 3 :(得分:0)

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