Как разделить адресную строку в T-SQL? - PullRequest
1 голос
/ 26 июня 2009

Я хочу разбить столбец на 4 столбца на основе столбца.

Например: значение столбца включает «City_Name», «State», «Zipcode», «Country»

Я хочу разбить его на 4 разных столбца, таких как City_Name, State, Zipcode, Country.

Как я могу сделать это с помощью T-SQL?

Ответы [ 5 ]

7 голосов
/ 26 июня 2009

при условии, что у вас всегда есть 3 запятых в этом столбце, вы можете использовать функцию PARSENAME

create table #test(Col varchar(100))
insert #test values('City_Name,State,Zipcode,Country')
insert #test values('New York City,NJ,10028,United States')


select parsename(replace(Col,',','.'),4) as City_Name,
parsename(replace(Col,',','.'),3) as State,
parsename(replace(Col,',','.'),2) as Zipcode,
parsename(replace(Col,',','.'),1) as Country
from #test

output

City_Name   State   Zipcode Country
New York City   NJ  10028   United States
0 голосов
/ 26 июня 2009

Протестировано с вашей строкой образца:

CREATE FUNCTION fn_PARM (@Parm nvarchar(2000))
RETURNS @TParm TABLE (City_Name nvarchar(100),State nvarchar(100),Zipcode nvarchar(100),Country nvarchar(100)) 
AS  
BEGIN 

DECLARE @City_Name nvarchar(100)
    ,@State nvarchar(100)
    ,@Zipcode nvarchar(100)
    ,@Country nvarchar(100)
    ,@CommaPosition1 tinyint
    ,@CommaPosition2 tinyint

    SELECT @CommaPosition1 = charindex(',',@Parm)
    IF (@CommaPosition1>0) 
    BEGIN
        SELECT @City_Name = ltrim(rtrim(SUBSTRING(@Parm,1,@CommaPosition1 - 1)))
        SELECT @CommaPosition2 = @CommaPosition1 + 1

        SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2)
        IF (@CommaPosition1>0) 
        BEGIN
            SELECT @State = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1))))
            SELECT @CommaPosition2 = @CommaPosition1 + 1

            SELECT @CommaPosition1 = charindex(',',@Parm,@CommaPosition2)
            IF (@CommaPosition1>0) 
            BEGIN
                SELECT @Zipcode = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition2 + 1,@CommaPosition1 - (@CommaPosition2 + 1))))
                SELECT @Country = ltrim(rtrim(SUBSTRING(@Parm,@CommaPosition1 + 1,LEN(@Parm))))
            END
        END
    END

    INSERT INTO @TParm (City_Name, State, Zipcode,Country) 
        VALUES (@City_Name, @State, @Zipcode, @Country)

    RETURN 
END 
GO

Простое использование:

select * from fn_PARM('Delhi , Delhi ,34567 ,IND' )

Для использования в запросе см. Эта статья MSDN об использовании APPLY.

0 голосов
/ 26 июня 2009

шаг 1: создайте четыре новых столбца в таблице базы данных. поскольку вы добавляете новые столбцы в существующую таблицу, они должны иметь значения по умолчанию (например, пустую строку)

шаг 2: запустите запрос на обновление, который обновит ваши четыре новых столбца на основе вашего старого столбца. Для этого используйте строковые функции SQL (можете найти их в справочнике, например, SUBSTRING )

шаг 3: отбросить старый столбец

0 голосов
/ 26 июня 2009

Создать новую таблицу с нужными полями. Просмотрите записи в исходной таблице и разделите значение в этом столбце по разделителю. Для разделения вы можете использовать charindex, substring и другие функции для работы со строками. Вы можете закодировать эту логику в SP или функции.

0 голосов
/ 26 июня 2009

Если у вас есть очевидные разделители в исходном столбце, вы можете написать пользовательскую функцию или использовать встроенное регулярное выражение, чтобы извлечь ваши данные в 4 столбца. Как вы это делаете, зависит от:

  • ваши данные и особенно насколько они однородны
  • ваш RDMBS

Возможно, вы захотите, чтобы мы посмотрели некоторые примеры данных для дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...