2017-11-12 11 views
1

この作品を検索:休日DOYのIN(文字列)(Postgresqlの)

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, 
CASE 
WHEN doy IN (1,2,3) THEN 0 ELSE 8 END 
FROM month 

http://sqlfiddle.com/#!15/aed15/10

しかし、私は、文字列

CREATE TABLE holidays 
    (id int4,days character(60));  
INSERT INTO holidays 
    (id,days) 
VALUES 
    ('2017','1,2,3'); 

として1,2,3を保存する場合.. 1,2,3を次の文字列に置き換えます。

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, days, 
CASE 
WHEN doy::text IN (days) THEN 0 ELSE 8 END 
FROM month 
LEFT JOIN holidays ON id=2017 

http://sqlfiddle.com/#!15/aed15/13

「日」は正しくキャストされていないようです。しかし、私はどのように把握することはできません。ここ

TIA、

答えて

1

最短ソリューションは、配列に文字列リストを回すとANY構築物を使用することになります。

WITH month AS ( 
SELECT date_part('doy',d.dt) as doy, 
dt::date as date 
FROM generate_series('2017-01-01','2017-01-15', interval '1 day') as d(dt) 
) 

SELECT date, days, 
CASE 
WHEN doy::text = ANY(concat('{',days,'}')::text[]) THEN 0 ELSE 8 END 
FROM month 
LEFT JOIN holidays ON id=2017 

しかし、それは私が持っている間違った

+0

を感じているように私は、ソリューション全体を再考う休日を別々に保管すること。あなたの提案は何ですか? – sibert

+0

私はおそらく具体的な日付の休日のテーブルを持っています。 hilidaysの百年は、まだ例外的な小さなテーブルになるでしょう –

+0

doy = ANY(string_to_array(days、 '、'):: integer [])THEN 0 ELSE 8も動作するようです。その他の提案はありますか? – sibert

関連する問題