2012-02-29 101 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