在 PostgreSQL 中为临时变量分配特定的数据类型
Posted
技术标签:
【中文标题】在 PostgreSQL 中为临时变量分配特定的数据类型【英文标题】:Assiging a specific data-type for temporary variable in PostgreSQL 【发布时间】:2012-11-14 02:46:43 【问题描述】:我有一个查询,我需要在其他查询中使用该查询的结果。所以,我使用了“WITH .. As”。问题是临时变量应该是整数,而它是自动以文本数据类型创建的。 如何更改或修改代码以具有整数数据类型的变量。
WITH A as (
SELECT ambtemp,
date_trunc('hour', dt)+
CASE WHEN date_part('minute', dt) >= 30
THEN interval '30 minutes'
ELSE interval '0 minutes'
END as t
FROM temm),
B as(
SELECT ambtemp,t,
max(ambtemp) OVER (PARTITION BY t) as max_temp,
min(ambtemp) OVER (PARTITION BY t) as min_temp
FROM A)
SELECT *
FROM B
WHERE (max_temp - min_temp) <= 0.2
max_temp 和 min_temp 应该是整数数据类型,而它们是文本格式。
【问题讨论】:
【参考方案1】:谢谢@Igor Romanchenko
WITH A as (
SELECT ambtemp,
date_trunc('hour', dt)+
CASE WHEN date_part('minute', dt) >= 30
THEN interval '30 minutes'
ELSE interval '0 minutes'
END as t
FROM temm),
B as(
SELECT ambtemp,t,
max(ambtemp::float(23)) OVER (PARTITION BY t) as max_temp,
min(ambtemp::float(23)) OVER (PARTITION BY t) as min_temp
FROM A)
SELECT *
FROM B
WHERE (max_temp - min_temp) <= 0.2
【讨论】:
【参考方案2】:要更改类型,您需要使用 ::
运算符对其进行转换。因此,要将整数转换为字符串,您可以使用myCol::Text
。
在您的具体情况下,您正在做相反的事情:
max(ambtemp) OVER (PARTITION BY t) as max_temp::int,
min(ambtemp) OVER (PARTITION BY t) as min_temp::int
您可能希望通过以下方式检查空值:
NULLIF(your_value, '')::int
我也会对不可转换为整数的值保持谨慎。
请参阅The PostgreSQL documentation 了解有关强制转换和类型的更多信息。
【讨论】:
也许是max(ambtemp::int) OVER (PARTITION BY t) as max_temp
? max(text)::int
和 max(text::int)
可以产生不同的结果。以上是关于在 PostgreSQL 中为临时变量分配特定的数据类型的主要内容,如果未能解决你的问题,请参考以下文章
在 PostgreSQL 中为特定模式和表所有者创建表的过程是啥