Postgresql 从此SELECT CASE语句中获取NULL
下面有一段代码,根据当天的情况,它应该返回true或false,问题是我得到了一个Postgresql 从此SELECT CASE语句中获取NULL,postgresql,case,Postgresql,Case,下面有一段代码,根据当天的情况,它应该返回true或false,问题是我得到了一个null。 显然,当我试着输入一个像2017年8月11日(星期三)这样的日期时,我得到了一个预期的假日期。不过,它在其他日子不起作用。 有人知道我为什么得到这个空报税表吗 select (CASE upper(to_char(now()::timestamp without time zone,'Day')) WHEN 'SUNDAY' THEN ('false'::boolean) WHEN 'MOND
null
。
显然,当我试着输入一个像2017年8月11日(星期三)这样的日期时,我得到了一个预期的假日期。不过,它在其他日子不起作用。
有人知道我为什么得到这个空报税表吗
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
(空)
附言:
此代码:选择upper(to_char(now()::timestamp,不带时区,'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
用这个代替
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_给出的答案已经提到的,您可能希望从日期列中提取一周中的数字日,而不是按此路线
看来,问题的直接原因是日期名称后面有空格。用
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_给出的答案已经提到的,您可能希望从日期列中提取一周中的数字日,而不是按此路线
我需要知道日期名称,我必须检查是否可以在特定日期进行特定交易。你需要知道代表该日期名称的道琼斯指数好的,它现在可以工作了。谢谢为什么语言字符串不能很好地工作?为什么要冒着编写被某些设置破坏的代码的风险?(也许一个法国人想用法语来运行lang)星期几的数字是通用的,请使用数字。无需使用
案例
,您可以将其简化为提取(dow from dd)=5
我需要知道日期名称,我必须检查特定的交易是否可以在特定的日期进行。你需要知道代表该日期的道琼斯指数好的,它现在起作用了。谢谢为什么语言字符串不能很好地工作?为什么要冒着编写被某些设置破坏的代码的风险?(也许一个法国人想让朗成为法国人)星期几的数字是通用的,使用这些数字。不需要案例
,你可以将其简化为提取(dow from dd)=5
false
为什么不简单地选择提取(isodow from current_date)=5
如果要测试今天是否为星期五?'false':布尔值可以简化为false
如果要测试今天是否为星期五,为什么不简单地选择extract(isodow from current_date)=5
?