![](/img/trans.png)
[英]PostgreSQL SUM CASE expression with THEN 1 THEN 0 ELSE 0
[英]How to not evaluate the ELSE part of a PostgreSQL CASE expression
我必须将两种类型的输入转换为有效的时间戳:
现在我是这样做的:
timestamp_comumn = CASE WHEN ? ~ '\d{13}' THEN to_timestamp(?::bigint/1000) ELSE ?::timestamp END
对于输入为“1626273917256”的情况,结果为:
timestamp_comumn = CASE WHEN '1626273917256' ~ '\d{13}' THEN to_timestamp('1626273917256'::bigint/1000) ELSE '1626273917256'::timestamp END
但这会引发错误:
SELECT CASE WHEN '1626273917256' ~ '\d{13}' THEN to_timestamp('1626273917256'::bigint/1000) ELSE '1626273917256'::timestamp END
ERROR: date/time field value out of range: "1626273917256"
LINE 1: ...N to_timestamp('1626273917256'::bigint/1000) ELSE '162627391...
^
HINT: Perhaps you need a different "datestyle" setting.
很明显,因为 PostgreSQL 也会评估 ELSE 部分。
有没有办法在 SQL 中做到这一点? 或者唯一的选择是在脚本部分执行此操作?
您的测试正在欺骗您这将如何在生产中工作。
PostgreSQL 可以看到'1626273917256'::timestamp
是一个常量,并尝试提前评估它。 只要你引用的不是文字,你应该没问题。
=> WITH str_times (t) AS (VALUES ('1626273917256'::text)) SELECT CASE WHEN t ~ '\d{13}' THEN to_timestamp(t::bigint/1000) ELSE t::timestamp END FROM str_times;
t
────────────────────────
2021-07-14 14:45:17+00
(1 row)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.