Есть ли способ использовать результат SELECT в качестве идентификатора столбца в запросе? (PostgreSQL) - PullRequest
0 голосов
/ 26 мая 2011

Мне нужно сделать запрос, подобный этому

select * from calendar where (select to_char(now(), 'day')) = true;

, но это недопустимо и завершается ошибкой с ERROR: failed to find conversion function from unknown to boolean.

Запрос, который я пытаюсь написать, при запуске сегодня будет кипетьвплоть до

select * from calendar where thursday = true;

Но завтра должно быть

select * from calendar where friday = true;

Таблица имеет следующую схему

mbta=# \d calendar
             Table "public.calendar"
   Column   |          Type          | Modifiers 
------------+------------------------+-----------
 service_id | character varying(255) | not null
 monday     | boolean                | 
 tuesday    | boolean                | 
 wednesday  | boolean                | 
 thursday   | boolean                | 
 friday     | boolean                | 
 saturday   | boolean                | 
 sunday     | boolean                | 
 start_date | integer                | 
 end_date   | integer                | 

Как правильно написать этот запрос?

Ответы [ 3 ]

2 голосов
/ 26 мая 2011

Да, есть решение. Очевидно, что вы не можете использовать результат подвыбора вместо столбца, но вы можете изменить отношение в соответствии с запросом такого рода. Сначала создайте подвыбор, который переносит отдельные столбцы в один столбец

SELECT calendar.*, 'monday' AS weekday, monday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'tuesday' AS weekday, tuesday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'wednesday' AS weekday, wednesday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'thursday' AS weekday, thursday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'friday' AS weekday, friday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'saturday' AS weekday, saturday AS dayvalue FROM calendar
UNION ALL
SELECT calendar.*, 'sunday' AS weekday, sunday AS dayvalue FROM calendar

Затем вы можете обернуть все это как подвыбор и выделить только строки с правильным днем ​​недели:

SELECT * FROM (
    SELECT calendar.*, 'monday' AS weekday, monday AS dayvalue FROM calendar
    UNION ALL
    SELECT calendar.*, 'tuesday' AS weekday, tuesday AS dayvalue FROM calendar
    UNION ALL
    ...         -- You get the idea.
    UNION ALL
    SELECT calendar.*, 'sunday' AS weekday, sunday AS dayvalue FROM calendar
) AS ss WHERE to_char(now(), 'day') = ss.weekday AND dayvalue = true; 
2 голосов
/ 26 мая 2011

Это ужасная схема ... Куча альтернатив:

  1. Заменить поля «понедельник, вторник ...» одним целочисленным полем, которое следует интерпретировать как битовую маску, или использовать тип данных битовая строка

  2. Замените их одним полем, содержащим массив целых чисел (дней недели).

  3. Денормализация в дополнительную таблицу с одним полем day_of_week и FK для вашей таблицы календаря.

0 голосов
/ 26 мая 2011
select * from calendar where (to_char(now(), 'day') != 'Monday' || monday) && (to_char(now(), 'day') != 'Tuesday' || tuesday) && …

Учитывая новую схему, я думаю, что-то вроде этого - ваша лучшая ставка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...