2011-05-26 56 views
0

我需要做一個這樣的查詢有沒有辦法在查詢中使用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    | 

如何正確編寫此查詢?

回答

2

這一個醜陋的架構......一堆的替代品:

  1. 替換「週一,週二......」由一個整型字段的字段,被解釋爲一個位掩碼 - 或使用bit-string data type

  2. 將它們替換爲包含整數(星期幾)的單個字段。

  3. 非規範化爲一個額外的表,帶有一個day_of_week字段和一個FK到日曆表。

+0

謝謝我會採納您的建議並更改架構。 – dan 2011-05-26 14:49:17

0
select * from calendar where (to_char(now(), 'day') != 'Monday' || monday) && (to_char(now(), 'day') != 'Tuesday' || tuesday) && … 

鑑於新的模式,我認爲這樣的事情是你最好的選擇。

+0

我在上面添加了一些信息。這有幫助嗎? – dan 2011-05-26 13:48:29

+0

您有修改數據結構的選擇嗎?您應該有第二個表格將您的日曆時間(開始,結束)與一週中的一天或多天關聯起來。然後我認爲做出你的查詢會更容易。 – Kaltezar 2011-05-26 14:09:48

+0

@dan:非常有啓發性。我修改了我的答案,以考慮到新信息。 – 2011-05-26 14:10:40

2

是的,有一個解決方案。顯然,你不能使用子選擇的結果來代替列,但是你可以重新排列關係來適應這種查詢。首先,構建調換各個列到一個列子查詢

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

感謝您的精心解答。我認爲這是一個好兆頭,如果我改變模式,事情會變得更容易。 – dan 2011-05-26 14:49:57

相關問題