作者Antzzz (减肥中请勿喂食)
看板Database
标题Re: [SQL ] 请问要如何转换复选的栏位呢?
时间Thu Jan 3 12:53:17 2008
※ 引述《adrianshum (Alien)》之铭言:
: ※ 引述《sanwind (疾风迅雷)》之铭言:
: : 使用DB:MS SQL 2000
: : 因为在做有关问卷的JOB,当中有遇到复选的问题
: : 比如:
: : 现有个TABLE A
: : 内容为
: : S_ID CHOISE
: : 1 A,B,C
: : 2 B,C
: : 3 A,C
: : 现想要使用SQL语法将之写入另一个TABLE B
: : 变成:
: : S_ID CHOISE_A CHOISE_B CHOISE_C
: : 1 1 1 1
: : 2 1 1
: : 3 1 1
: : 呈现这样的状态。因为要统计各选项的人数。
: : 请问要怎麽写这样的语法呢?谢谢
: 选择的英文是 Choice 不是 Choise
: 通常这种情况,会用:
: SID CHOICE
: 1 A
: 1 B
: 1 C
: 2 B
: 2 C
: 3 A
: 3 C
: 这种做法的... 你的第二种做法,要是以後要加新选项
: 又要改 schema 了。
: 而你的问题,ANSI SQL 该没有直接的解法。可以利用各
: DBMS 的 string finding function. 比如 Oracle 的话,
: insert into T2(S_SID, C_A, C_B, C_C)
: select
: sid,
: decode(instr(choice, 'A'), 0, 0, 1),
: decode(instr(choice, 'B'), 0, 0, 1),
: decode(instr(choice, 'C'), 0, 0, 1)
: from T1
不好意思,我刚刚才发现…我把两位版友的帐号写反了
真是非常抱歉orz
订正一下
其实sandwind已经写出来了,只是可以直接用case叙述写成一个查询:
select S_ID
,case when charindex('A', CHOICE) > 0 then 1 else null end as CHOICE_A
,case when charindex('B', CHOICE) > 0 then 1 else null end as CHOICE_B
,case when charindex('C', CHOICE) > 0 then 1 else null end as CHOICE_C
from A
注意我把CHOISE改成CHOICE
null也可以改成0,看你的表格资料库要求
不过我也觉得adrianshum版友的表格设计比较好扩充
可以做一个暂存表格去连结原来的表来输出adrianshum的表:
select S_ID, temp.CHOICE
from A
inner join (select 'A' as CHOICE
union
select 'B' as CHOICE
union
select 'C' as CHOICE
) temp on charindex(temp.CHOICE, #temp.CHOICE) > 0
不过一般这情况,资料库会有列出全部选择ABC的表
这样的话就不需要temp表,直接join ABC选择表就可以了
除了charindex函数,也可以用like来判断ABC是不是在字串中
而且在这里like的意思比较像你想要的功能,毕竟charindex主要是用来查位置的
※ 编辑: Antzzz 来自: 211.20.100.62 (01/03 13:05)
※ 编辑: Antzzz 来自: 211.20.100.62 (01/07 18:41)