如何解决有没有一种方法可以将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) && …
有了新的架构,我认为这样最好。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。