簡體   English   中英

JOINING逗號分隔值

[英]JOINING comma separated values

我有2個表格如下:

TABLE:CITY

CITY_ID CITY
----------------
1   London

2   Chicago

3   Newyork

4   Delhi


TABLE:TRAIN

TRAIN_ID CITY_TRAVELS
----------------------
1111           1,3

2222           4

3333           1,2

4444           2,3

我想寫一個查詢,它應該給出以下結果:TRAIN表中的CITY_TRAVELS類型為VARCHAR,CITY表的CITY_ID類型為INT。 查詢結構如何?

TRAIN_ID  CITY
-------------------------
1111     London,Newyork

2222     Delhi

3333     London,Chicago

4444     Chicago,Newyork

謝謝Satyajit

好的結構很糟糕,但你可以在一些UDF中解析逗號分隔的字符串,並使用子查詢將數字連接到城市。 希望文章“在Sql Server中拆分函數將逗號分隔的字符串分解為表”將對您有所幫助!

-- sample data
declare @City table
(
    CityID int,
    City varchar(50)
)

declare @Train table
(
    TrainID int,
    CityTravels varchar(50)
)

insert into @City 
select 1, 'London'
union all
select 2, 'Chicago'
union all
select 3, 'Newyork'
union all
select 4, 'Delhi'

insert into @Train
select 1111, '1,3'
union all
select 2222, '4'
union all
select 3333, '1,2'
union all
select 4444, '2,3'


-- solution
;with cte as
(
    select
        t1.TrainID, t2.City
    from
    (
        select
            TrainID, 
            -- t2.c - the xml tag that function nodes provides
            -- query('data(.)') gets the value of the tag
            CityID = cast(cast(t2.c.query('data(.)') as varchar) as int)
        from
        (
            select 
                TrainID,
                -- represent Cities list in the xml, 
                -- which is proper for xquery node function
                -- for example <root><a>1</a><a>2</a></root>
                CityTravelsXml = cast('<root><a>' + replace(CityTravels, ',', '</a><a>') + '</a></root>' as xml)
            from @Train
        ) t1
        -- xquery nodes function for each tag /root/a returns a separate row 
        -- with single column the represents the tag
        cross apply CityTravelsXml.nodes('/root/a') t2(c)
    ) t1
    join @City t2 on t1.CityID = t2.CityID
)


select
    TrainID,
    -- truncate the last comma
    Cities = case when Cities is not null then substring(Cities, 1, len(Cities) - 1) end
from
(
    select 
        TrainID, 
        Cities = 
        (
            -- for xml here concatenates strings in a column
            select 
                City + ',' 
            from cte t2 
            where t2.TrainID = t1.TrainID 
            for xml path('')
        ) 
    from @Train t1
) t

編輯:刪除了第二個解決方案,因為經過一些測試后,它顯示出不合適的性能,盡管它對表格的引用較少。

create database train

create table city(
city_id int identity(1,1),
city varchar(max)
)

create table train(
train_id int identity(1111,1111),
city_travels varchar(max)
)

insert into city values ('London');
insert into city values ('Chicago');
insert into city values ('NewYork');
insert into city values ('Delhi');

insert into train values ('1,3,4');
insert into train values ('4');
insert into train values ('1,2');
insert into train values ('1,2,3,4');

create table #train(
train_id int,
city varchar(max)
)
declare @count int, @id int,@first int;
declare @train_id int,@index int;
declare @city_travels varchar(max),@city_name varchar(max);
set @city_name=null;

declare train_cursor CURSOR for
select train_id,city_travels from train
open train_cursor
fetch next from train_cursor into @train_id,@city_travels

    while (@@fetch_status=0)
    begin
        set @first=0;
        set @index = charindex(',',@city_travels);
            if(@index!=0)
            begin
                if(@first=0)
                begin
                    set @id=convert (int,substring(@city_travels,1,@index-1));
                    set @city_travels=substring(@city_travels,@index+1,len(@city_travels));
                    set @city_name=((select city from city where city_id=@id)+',');
                    set @index=charindex(',',@city_travels);
                    set @first=1;
                end
                while(@index!=0)
                begin
                    set @id=convert (int,substring(@city_travels,1,@index-1));
                    set @city_travels=substring(@city_travels,@index+1,len(@city_travels));
                    set @index=charindex(',',@city_travels)
                    set @city_name=(@city_name+(select city from city where city_id=@id)+',');
                end
            set @id=convert (int,@city_travels);
            set @city_name=(@city_name+(select city from city where city_id=@id));
            insert into #train values (@train_id,@city_name);
            set @city_name=null;
            end
        else
        begin
            set @id=convert (int,@city_travels);
            set @city_name=(select city from city where city_id=@id);
            insert into #train values (@train_id,@city_name);
            set @city_name=null;
        end
    fetch next from train_cursor into @train_id,@city_travels
    end
select * from city;
select * from train;
select * from #train;
close train_cursor
deallocate train_cursor
truncate table #train

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM