在PostgreSQL中的显式类型转换

3

我正在使用以下查询将两个表连接起来:

update campaign_items
set last_modified = evt.event_time
from (
    select max(event_time) event_time
        ,result
    from events
    where request = '/campaignitem/add'
    group by result
    ) evt
where evt.result = campaign_items.id

当结果列为字符变量类型,而id为整数类型时,如果结果列中包含数字(例如12345),该怎么办?

如何运行此查询并将结果列的类型从字符转换为id(整数)?


使用::运算符(evt.result::int = campaign_items.id) - Fabian Pijcke
https://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS - user330315
你可以通过 CAST(evt.result as int) 进行类型转换。 - Hannan
2个回答

5

如果在这种情况下,您不需要进行类型转换,因为PostgreSQL将隐式地进行类型转换。例如,您可以尝试:

 select ' 12 ' = 12

你会看到,即使字符串版本中存在额外的空格,它也会返回 true。但是,如果你需要显式转换,请使用以下方法。
 where evt.result::int = campaign_items.id 

根据您的评论,您有类似convRepeatDelay的值,这些显然无法转换为int。那么你应该将你的int转换为char!!
 where evt.result = campaign_items.id::char

我按照您的建议运行,但出现以下错误:错误:整数的输入语法无效:“convRepeatDelay” - sForSujit
它没有出现任何错误,但是数据库中没有任何更改:->查询成功返回:0行受影响,执行时间为275毫秒。 - sForSujit
在程序设计方面的内容翻译为中文。仅返回翻译后的文本:具体添加两个表格的一些示例数据。请注意,因为原始文本没有提供有关表格的信息,我无法提供完整的翻译。以下只是一个示例:Table 1:
Name Age Gender
Tom 25 Male
Jane 30 Female
Alex 20 Male
Table 2:
Product Price
Apple 1.50
Banana 0.75
Orange 2.00
表格1:
名字 年龄 性别
汤姆 25 男性
30 女性
亚历克斯 20 男性
表格2:
商品 价格
苹果 1.50
香蕉 0.75
橙子 2.00
- e4c5
很高兴能够提供帮助。 - e4c5

1

有几种解决方案。您可以使用强制类型转换运算符 :: 将给定类型的值转换为另一种类型:

WHERE evt.result::int = campaign_items.id

您也可以使用更加便携的CAST函数:
WHERE CAST(evt.result AS int) = campaign_items.id

请注意,为了提高性能,您可以在转换操作上添加索引(注意必须使用双括号),但是然后您必须使用GROUP BY result::int而不是GROUP BY result来利用该索引。
CREATE INDEX i_events_result ON events_items ((result::int));

顺便说一句,如果你知道结果列只包含整数,最好的选择可能是将其更改为int类型。


错误:整数的输入语法无效:“convRepeatDelay” - sForSujit
你能否更精确地说明出了什么问题?看起来结果列来自事件表而不是活动项目表,我会进行更新的 :-) - Fabian Pijcke
是的,你说得对,“result”和“id”分别来自“events”和“campaign_items”表中的两列。 - sForSujit
哦,这意味着你们其中一个结果值是“convRepeatDelay”。你可以用“SELECT * FROM events WHERE result ='convRepeatDelay'?” 来检查一下吗? - Fabian Pijcke
哦,没错..连我自己都感到惊讶..那么现在我该怎么做? - sForSujit
考虑解决 e4c5 的问题 ;-) - Fabian Pijcke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接