在 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_tempmax(text)::intmax(text::int) 可以产生不同的结果。

以上是关于在 PostgreSQL 中为临时变量分配特定的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 中为特定模式和表所有者创建表的过程是啥

如何在postgresql过程中为多维数组赋值

动态内存分配与指向它的指针变量

如何在 postgresql 中为数据库创建用户? [关闭]

帮助在特定模型实例中为用户分配角色的数据库策略

Locust 负载测试:如何在所有其他 API 中为一个特定 API 分配单个用户