SQL SERVER 2008 R2 разделение строк - PullRequest
1 голос
/ 01 марта 2012

Я хочу разделить столбец строк, скажем «дорога из 99 кристальных источников», и получить только 2 слова (99 и кристалл) соответственно и обновить 99 до одного столбца и кристалл до другого столбца другой таблицы. Как я могу сделать это, используя charindex и подстроку?

Ответы [ 3 ]

1 голос
/ 01 марта 2012

Предполагая, что вы выбираете "99" и "кристалл" только потому, что они являются первыми двумя словами ...

Вы можете сделать это за один шаг, но для простоты чтения решения I 'Выделил это

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
1 голос
/ 01 марта 2012

Может быть, что-то вроде этого:

Сначала создайте функцию, которая получает часть строк:

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 pn=@pos
    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
1 голос
/ 01 марта 2012

Вот пример кода о том, как это сделать ...

Сначала создайте эту функцию:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...