2010-10-19 43 views
1

我在表中有一個名爲Address的列。 我有值,如如何在SQL Server 2005中分割一個句子

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,因爲這已被排除。

任何想法都會非常有幫助。

+1

如果您發佈的代碼或數據樣本或XML,** **請在高亮文本編輯器的線,然後點擊「代碼」按鈕(101 010)在編輯器工具欄上進行恰當的格式化和語法突出顯示! – 2010-10-19 16:27:57

+1

我不明白這個問題。 – Brad 2010-10-19 16:28:46

+0

下次當您發佈問題時,請儘可能詳細。您不斷添加先決條件和限制。使用函數來完成這項工作並不像您想象的那樣徵稅,但當然您並未指定表格的大小。如果你的桌子很大,我建議你查看PAF-ing和地址格式,有專門研究這個的公司(我不會在這裏發佈名字,那將是廣告)。 – 2010-10-21 08:42:49

回答

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 
+0

這只是剝去了最後一個連字符。它與OP的要求是連字符在連字符的一部分出現時保持不變。 – 2010-10-19 18:30:21

+0

謝謝喬,很好的地方。我更正了代碼。 – 2010-10-19 20:12:27

1

這不是SQL所要做的。如果可能的話,這樣的邏輯在你的應用層更好地服務(並且更容易完成)。

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 

如果你有內的左側空的空間,那麼你應該描述更緊密地添加數據的規則,也許嘗試使用正則表達式,因爲它提到

+0

這不會按問題中所述將「A-B」拆分爲「A B」。 – 2010-10-19 16:49:19

+0

@Danel是的你是對的我的錯,我試圖改變 – adopilot 2010-10-19 16:54:06