2011-05-26 14 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

です:まず、

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 

次にあなたが副選択として、このすべてを包んで、右平日と行だけを取り出すことができ、単一の列に個々の列を転置副選択を構築醜いスキーマ...代替の束:

  1. 置き換え「月曜日、火曜日...」単整数フィールドによってフィールドは、ビットマスクとして解釈される - またはを使用します3210

  2. 整数の配列(曜日)を含む単一のフィールドで置き換えます。

  3. 余分なテーブルにデノーマライズし、1日の所要時間フィールドとFKをカレンダーテーブルに適用します。

+0

ありがとう私は助言を取ってスキーマを変更します。 – dan

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

新しいスキーマを考えると、私はこれがあなたの最善の策だと思います。

+0

私は上記の情報をいくつか追加しました。これは役に立ちますか? – dan

+0

データ構造を変更する選択肢がありますか?カレンダーの期間(開始日、終了日)を1つ以上の曜日と関連付けるための2番目のテーブルが必要です。あなたの質問をするのは簡単でしょう。 – Kaltezar

+0

@dan:非常に啓発です。新しい情報を考慮に入れて私の答えを改訂しました。 –

2

はい、解決策があります。明らかに、列の代わりに副選択の結果を使用することはできませんが、そのような問合せに合わせて関係を再編成できます。

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

関連する問題