从此选择案例语句中获取 NULL



所以我在下面有这段代码,它应该根据当天返回 true 或 false,问题是我得到了一个null.显然,当我尝试将日期定11-08-2017(星期三(时,我能够按预期获得false。但是,它在其他日子不起作用。有人知道为什么我得到这个空返回吗?

select (CASE upper(to_char(now()::timestamp without time zone,'Day')) 
 WHEN 'SUNDAY'
  THEN ('false'::boolean)
 WHEN 'MONDAY'
  THEN ('false'::boolean)
 WHEN 'TUESDAY'
  THEN ('false'::boolean)
 WHEN 'WEDNESDAY' -- works
  THEN ('false'::boolean)
 WHEN 'THURSDAY'
  THEN ('false'::boolean)
 WHEN 'FRIDAY'
  THEN ('true'::boolean)
 WHEN 'SATURDAY'
  THEN ('false'::boolean)
END) as res;

输出:

res (null)

附注:

此代码:select upper(to_char(now()::timestamp without time zone,'Day'))工作并且始终具有输出。只是当我在其中添加一个 CASE 时,它会返回一个null.

改用这个

extract(dow from  current_timestamp)
- This returns 0 for Sunday, 1 for Monday,...,6 for Saturday.

不要依赖语言字符串,最好使用数字。

用于测试:

select
*
, case extract(dow from  dd)
    when 5 then 'true'::boolean else 'false'::boolean
  end
FROM generate_series
        ( '2017-11-01'::timestamp 
        , '2017-11-12'::timestamp
        , '1 day'::interval) dd

似乎问题的直接原因是日期名称后有尾随空格。 用trim包裹一周中的某一天的表情似乎可以解决问题:

select
    case trim(upper(to_char(now()::timestamp without time zone,'Day'))) 
    when 'SUNDAY'
    then ('false'::boolean)
    when 'MONDAY'
    then ('false'::boolean)
    when 'TUESDAY'
    then ('false'::boolean)
    when 'WEDNESDAY' -- works
    then ('false'::boolean)
    when 'THURSDAY'
    then ('false'::boolean)
    when 'FRIDAY'
    then ('true'::boolean)
    when 'SATURDAY'
    then ('false'::boolean)
    end as res;

正如@Used_By_Already给出的答案所提到的,您可能希望从日期列中提取数字星期几,而不是走这条路线。

演示

最新更新