2012-02-29 100 views
1

我想分割一列字符串,如「99 crystal springs road」,並分別獲得2個字(99和水晶),並將99更改爲一列,並將水晶更新爲另一個表的另一列。我怎樣才能使用charindex和substring?SQL SERVER 2008 R2字符串拆分

+1

什麼是規則,爲什麼你只想要99和水晶?因爲他們是前兩個字? – kaj 2012-02-29 23:38:43

回答

1

這裏是如何做到這一點一些示例代碼...

首先,創建這個函數:

CREATE FUNCTION [dbo].[GetStringPart] 
(@fullString varchar(200), @pos tinyint) 
RETURNS VARCHAR(200) -- return_data_type. 
AS 
BEGIN 
    IF @pos IS NULL OR @pos <= 0 
     SET @pos = 1 

    declare @secondPart varchar(200),@firstPart varchar(200),@output varchar(200) 
    declare @firstSpace int, @secondSpace int 

    set @firstSpace = CHARINDEX(' ', @fullString) 

    IF @firstSpace <= 0 
     RETURN '' 
    ELSE IF @pos = 1 
     BEGIN 
      SET @output = LTRIM(RTRIM(SUBSTRING(@fullString, 1, @firstSpace))) 
     END 
    ELSE 
     BEGIN 
      SET @secondSpace = CHARINDEX(' ', @fullString, CHARINDEX(' ', @fullString)+1) - CHARINDEX(' ', @fullString)+1 
      IF @secondSpace <= 0 
       SET @secondSpace = LEN(@fullString) - @firstSpace + 1 
      SET @output = LTRIM(RTRIM(SUBSTRING(@fullString, @firstSpace, @secondSpace))) 

     END 

    RETURN @Output 
END 

GO 

然後你可以使用它像這樣:

declare @origTable table(name varchar(100)) 
insert into @origTable (name) values ('99 crystal springs road') 

declare @newTable table(col1 varchar(100), col2 varchar(100)) 

INSERT INTO @newTable (col1, col2) 
SELECT dbo.GetStringPart(name, 1), dbo.GetStringPart(name, 2) FROM @origTable 

select * from @newTable 
+0

我得到「無效的長度參數傳遞給左或SUBSTRING函數。」 – rsDesigner 2012-02-29 23:50:36

+0

我有一張表,上面有地址記錄。拆分地址並只獲得前兩個單詞並轉儲到另一個表中。我希望我正確地解釋這個問題。 – rsDesigner 2012-02-29 23:52:17

+0

該錯誤的原因可能是因爲您在每一行中沒有2個空格。我會創建一個函數,然後調用該函數。該函數可以有一些邏輯來檢查第二個空間。我修改了上面的答案。 – 2012-03-01 00:17:56

1

假設你選擇「99」和「水晶」只是因爲他們是前兩個字...

你可以做到這一點我吶一步,但爲了便於閱讀的解決方案,我已經分離出來

declare @sourceAddresses table 
(
    address varchar(100) 
) 

declare @split table 
(
    address varchar(100), 
    firstDelimiter int, 
    secondDelimiter int 
) 

declare @table table 
(
    part1 varchar(20), 
    part2 varchar(20) 
) 

insert into @sourceAddresses (address) values ('99 crystal springs road') 
insert into @sourceAddresses (address) values ('100 elsewhere road') 


insert into @split (address, firstDelimiter) 
select address, charindex(' ', address) 
from @sourceAddresses 

update @split 
set secondDelimiter = charindex(' ', address, (firstDelimiter+1)) 
where firstDelimiter > -1 

insert into @table (part1, part2) 
select substring(address, 0, firstDelimiter), substring(address, (firstDelimiter+1), (secondDelimiter-firstDelimiter)) 
from @split 
where firstDelimiter > -1 
    and secondDelimiter > -1 

select * from @table 
+0

我的「插入@table」代碼: – rsDesigner 2012-03-01 00:05:54

+0

更新的解決方案使用的是地址源表而不是單個變量地址 – kaj 2012-03-01 00:11:49

+0

這適用於此示例,但是當我使用長度爲90個字符的實際數據時,它會拋出殘差長度傳遞給LEFT或SUBSTRING函數。這可能是因爲NULLS還是EMPTY?或者如果只有兩個詞如「9街」? – rsDesigner 2012-03-01 00:19:37

1

也許是這樣的:

首先創建一個獲取字符串的一部分功能:

CREATE FUNCTION dbo.GetStringPart (@sep char(1), @s varchar(512),@pos int) 
RETURNS VARCHAR(200) 
AS 
BEGIN 
    DECLARE @output VARCHAR(200) 
    ;WITH Pieces(pn, start, stop) AS (
     SELECT 1, 1, CHARINDEX(@sep, @s) 
     UNION ALL 
     SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1) 
     FROM Pieces 
     WHERE stop > 0 
    ) 
    SELECT 
     @output=SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) 
    FROM Pieces 
    WHERE [email protected] 
    RETURN @Output 
END 

GO 

那麼你可以很容易做到這一點:

DECLARE @origalTable TABLE(name VARCHAR(100)) 
INSERT INTO @origalTable 
VALUES('99 crystal springs road') 

DECLARE @newTable TABLE(col1 VARCHAR(100), col2 VARCHAR(100)) 

INSERT INTO @newTable (col1, col2) 
SELECT dbo.GetStringPart(' ',name, 1), dbo.GetStringPart(' ',name, 2) FROM @origalTable 

SELECT * FROM @newTable 
DROP FUNCTION dbo.GetStringPart