有没有一种方法可以将SELECT的结果用作查询中的列标识符? PostgreSQL

问题描述

| 我需要做这样的查询
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                | 
如何正确编写此查询?     

解决方法

那是一个丑陋的模式...一堆替代方案: 用单个整数字段替换\'monday,tuesday ... \'字段,以将其解释为位掩码-或使用位字符串数据类型 用包含整数数组(一个星期几)的单个字段替换它们。 将非规范化为一个额外的表,其中包含单个day_of_week字段,并向您的日历表添加FK。     ,是的,有解决方案。显然,您不能使用子选择的结果来代替列,但是可以重新安排关系以适合这种查询。首先,建立一个将单个列转置为单个列的子选择
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 dayvalue FROM calendar
    UNION ALL
    SELECT calendar.*,tuesday AS dayvalue FROM calendar
    UNION ALL
    ...         -- You get the idea.
    UNION ALL
    SELECT calendar.*,sunday AS dayvalue FROM calendar
) AS ss WHERE to_char(now(),\'day\') = ss.weekday AND dayvalue = true; 
    ,
select * from calendar where (to_char(now(),\'day\') != \'Monday\' || monday) && (to_char(now(),\'day\') != \'Tuesday\' || tuesday) && …
有了新的架构,我认为这样最好。