在(字符串)中搜索假日doy(Postgresql)

在(字符串)中搜索假日doy(Postgresql),sql,postgresql,postgresql-9.4,Sql,Postgresql,Postgresql 9.4,这项工作: 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 但是如果我把1,2,3存储为一个字符串 CREA

这项工作:

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

但是如果我把1,2,3存储为一个字符串

CREATE TABLE holidays
   (id int4,days character(60));       
INSERT INTO holidays
   (id,days)
VALUES
   ('2017','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

看来“天”的铸造是不正确的。但我不知道怎么做


TIA,

这里最短的解决方案是将字符串列表转换为数组,并使用
任何
构造:

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

但我会重新考虑整个解决方案,因为感觉不对

我必须将假期分开存储。你的建议是什么?我可能要一张有具体日期的度假桌。如果doy=ANY(string_to_array(days,,')::integer[]),那么100年的天数对jaoin来说仍然是一个很小的例外表,那么0或者8似乎也可以工作。还有其他建议吗?当然。我认为将字符串强制转换为数组比将字符串解析为数组更快,但是,是的,应该也能工作。我的答案的主要思想是,在这里使用
=ANY(array)
构造比对字符串进行标量化更有效。当然,您可以使用不同的方法使字符串成为数组