代码之家  ›  专栏  ›  技术社区  ›  sibert

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

  •  1
  • sibert  · 技术社区  · 7 年前

    这项工作:

    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

    但是如果我将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
    

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

    “天”似乎是不正确的。但我不知道怎么做。

    TIA,

    1 回复  |  直到 7 年前
        1
  •  1
  •   Vao Tsun    7 年前

    这里最短的解决方案是将字符串列表转换为数组并使用 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
    

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