从此SELECT CASE语句获取NULL

时间:2017-11-10 05:11:08

标签: postgresql case

所以我在下面有这个代码,根据当天的情况,它应该返回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)

PS:

此代码:select upper(to_char(now()::timestamp without time zone,'Day'))有效且始终有输出。就在我在其中添加CASE时,它会返回null

2 个答案:

答案 0 :(得分:2)

改为使用

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

答案 1 :(得分:1)

您的问题的直接原因似乎是在日期名称后面有尾随空格。使用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_已经提到的答案,您可能希望从日期列中提取一周的数字日,而不是走这条路线。

Demo