2012-11-30 152 views
0

海兰,我有多个值,我需要检查
列表 例如:
1,2,4,
3,4,应该是:逗号分隔值到多个位列

day1 day2 day3 day4 
_1____1____0____1 
_0____0____1____1 

一种方法是

CAST(CASE WHEN PATINDEX('1,', [day]) > 0 THEN 1 ELSE 0 END AS BIT) as [day1], 
CAST(CASE WHEN PATINDEX('2,', [day]) > 0 THEN 1 ELSE 0 END AS BIT) as [day2], 
CAST(CASE WHEN PATINDEX('3,', [day]) > 0 THEN 1 ELSE 0 END AS BIT) as [day3], 
CAST(CASE WHEN PATINDEX('4,', [day]) > 0 THEN 1 ELSE 0 END AS BIT) as [day4] 

请帮助我一个更好的方法,因为我有多个列
谢谢

+0

你可以有1,2,4,15000作为输入?什么限制? –

+0

这里是一篇关于它的文章:http://www.sqlteam.com/article/parsing-csv-values-into-multiple-rows – Chris

+0

@Chris我知道我可以返回一个包含多行的表,但我需要多个'Columns ' – Zyku

回答

1

您可以使用您的选择与字符串的字符串拆分功能。

declare @T table 
(
    ID int identity, 
    day varchar(20) 
) 

insert into @T values 
('1,2,4,'), 
('3,4,') 

select isnull(P.[1], 0) as day1, 
     isnull(P.[2], 0) as day2, 
     isnull(P.[3], 0) as day3, 
     isnull(P.[4], 0) as day4 
from 
    (
    select T.ID, S.s, 1 as x 
    from @T as T 
    cross apply dbo.Split(',', T.day) as S 
) as T 
pivot (min(T.x) for T.s in ([1],[2],[3],[4])) as p 

结果:

day1 day2 day3 day4 
1  1  0  1 
0  0  1  1 
0

您可以使用概述的分割函数here,然后将这些值转换为列。

或!

This答案看起来像你想要做的一样的事情。

0

使用第二个表来存储有效日期,然后在其上查询。看到这个fiddle

编辑 查看更新后fiddle,或下面的代码:

create table test (day1 varchar(8), day2 varchar(8), day3 varchar(8), day4 varchar(8)); 
insert into test (day1, day2, day3, day4) values ('day1', 'day2', 'day3', 'day4'); 

create table valid_days (valid_day_no int); 
insert into valid_days values (1), (2), (4); 

select cast (case when exists(select 1 from valid_days where valid_day_no = substring(day1, 4, len(day1))) then 1 else 0 end as bit) day1, 
     cast (case when exists(select 1 from valid_days where valid_day_no = substring(day2, 4, len(day2))) then 1 else 0 end as bit) day2, 
     cast (case when exists(select 1 from valid_days where valid_day_no = substring(day3, 4, len(day3))) then 1 else 0 end as bit) day3, 
     cast (case when exists(select 1 from valid_days where valid_day_no = substring(day1, 4, len(day4))) then 1 else 0 end as bit) day4 
from test; 

注意,SQL是一个固定的列的语言,你需要使用一种编程语言动态生成可变长度列的查询。

+0

('day1'),('day2'),('day3'),('day4');这些应该是'COLUMNS' – Zyku

+0

更新了答案。 – Isaac