2010-07-04 2 views
0

У меня есть таблица в этом формате (по аналогии с расписанием занятий вы имели в колледже):Может ли это быть написано как запрос вместо использования функции?

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-запроса. Это не важно, это просто для знания :)

EDIT: Извините, я пропустил одно жизненно важное разъяснение. Может быть несколько строк за время матча. Он может иметь MF в одной строке, а W - на следующем. Теперь я понимаю, почему вы спрашивали фактический оператор create table.

+3

Можете ли вы включить фактическое заявление о создании таблицы? Это обеспечит лучшее представление о том, как выглядит таблица. Я не могу сказать, что происходит в этом формате. –

+3

Можете ли вы разместить дополнительную информацию о таблице? Например, типы данных? Являются ли недели значениями булевских значений? Время VARCHAR? – xil3

+0

Извините, я опубликовал фактическое утверждение таблицы создания. Я думал, что это будет более читаемо с образцами данных вместо типа данных. – Zesty

ответ

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', а затем вставьте корпус за каждый день в строковом здании.

+0

Хорошая работа! Впечатляет, что вы сделали это мысленно. Маленькая опечатка - замените + на ||. Спасибо за ответ. – Zesty

0

Да, вы можете. Но это страшная схема, поэтому очень сложно сделать такие запросы, как «показать мне общее количество часов, которые профессор преподаёт в этом семестре».

+0

Вы правы. К сожалению, я не контролирую эту таблицу. – Zesty

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 
+0

Мой плохой. Может быть несколько строк за время матча. Извините, что забыл упомянуть об этом. В противном случае ваш запрос будет правильным. – Zesty

Смежные вопросы