这可以写成查询而不是使用函数吗?

时间:2010-07-04 12:29:49

标签: sql plsql

我有一个这种格式的表格(类似于你在大学里的课程表):

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.现在我明白了为什么你们要求实际的创建表语句。

3 个答案:

答案 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)

是的,你可以。但这是一个糟糕的架构,让“向我展示教授在本学期教授的总小时数”这样的查询非常困难。