0

こんにちは、複数の値があり、チェックのリストが必要です
ex:
1,2,4,
3,4,should be :

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]  

複数の列があるため、より良い方法を教えて
ください

4

3 に答える 3

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
于 2012-11-30T15:06:23.733 に答える
0

2 番目のテーブルを使用して有効な日を格納し、それに対してクエリを実行します。このフィドルを参照してください。

EDIT 更新された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 は固定列言語であることに注意してください。可変長の列クエリを動的に作成するには、プログラミング言語を使用する必要があります。

于 2012-11-30T14:21:10.420 に答える
0

ここで概説されている分割関数を使用して、値を列にピボットできます。

また!

この答えは、あなたがやろうとしていることと同じように見えます。

于 2012-11-30T14:17:24.923 に答える