我有一个这种格式的表格(类似于你在大学里的课程表):
create table match_times
(
match_time varchar2(20 char),
match_sun_day char(1 char),
match_mon_day char(1 char),
match_tue_day char(1 char),
match_wed_day char(1 char),
match_thu_day char(1 char),
match_fri_day char(1 char),
match_sat_day char(1 char)
)
comment on column match_times.match_time is 'E.g. ''08:00-08:50''';
comment on column match_times.match_sun_day is '''U'' or null';
comment on column match_times.match_mon_day is '''M'' or null';
comment on column match_times.match_tue_day is '''T'' or null';
comment on column match_times.match_wed_day is '''W'' or null';
comment on column match_times.match_thu_day is '''R'' or null';
comment on column match_times.match_fri_day is '''F'' or null';
comment on column match_times.match_sat_day is '''S'' or null';
我想编写一个查询来获取例如:
8:00 - 9:00 MTF
9:00 - 10:15 TR
这可以使用函数轻松完成,但我很好奇是否可以通过使用SQL查询来完成。这并不重要,只是为了知识:)
编辑:对不起,我错过了一个重要的说明。每个匹配时间可以有多行。它可以在一行上有MF而在下一行上有W.现在我明白了为什么你们要求实际的创建表语句。答案 0 :(得分:2)
假设每个唯一的时间跨度只有一行(没有列出主键):
SELECT
match_time,
COALESCE(match_sun_time, '') +
COALESCE(match_mon_time, '') +
COALESCE(match_tue_time, '') +
COALESCE(match_wed_time, '') +
COALESCE(match_thu_time, '') +
COALESCE(match_fri_time, '') +
COALESCE(match_sat_time, '')
FROM
Match_Times
答案 1 :(得分:2)
这应该有效:
with days AS (
select
match_time,
max(coalesce(match_sun_day, '')) sun,
max(coalesce(match_mon_day, '')) mon,
max(coalesce(match_tue_day, '')) tue,
max(coalesce(match_wed_day, '')) wed,
max(coalesce(match_thu_day, '')) thu,
max(coalesce(match_fri_day, '')) fri,
max(coalesce(match_sat_day, '')) sat
from
match_times
group by
match_time
)
select
match_time + ' ' + sun+mon+tue+wed+thu+fri+sat
from
days
我没有安装方便测试它。最糟糕的情况是,如果您的数据库没有在max
的非空字符串之前订购空字符串,请将''
替换为'a'
,然后在字符串构建中每天输入一个案例。
答案 2 :(得分:0)
是的,你可以。但这是一个糟糕的架构,让“向我展示教授在本学期教授的总小时数”这样的查询非常困难。