在(字符串)中搜索假日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)
构造比对字符串进行标量化更有效。当然,您可以使用不同的方法使字符串成为数组