【问题标题】:Postgres Data Type Declarations and Typing, What's the Difference Between Double Colon and NotPostgres 数据类型声明和键入,双冒号和非冒号有什么区别
【发布时间】:2020-02-08 12:13:49
【问题描述】:

主要问题

我想知道使用双分号 :: 声明类型与在 Postgres 中使用 :: 声明类型与不有什么区别。

示例

INTERVAL '1 day'
-- vs
'1 day'::INTERVAL

还有很多问题...

  • :: 是类型转换吗?就像将字符串转换为 INTERVAL。

  • 如果不使用::,第一个示例 会叫什么,或者在不强制转换的情况下如何定义该数据类型?

  • 使用其中一个有什么好处吗?

  • 是在另一个之前介绍的吗?

  • 有速度优势吗?

  • 在社区中,一种方法是否标准化并优于另一种方法?

  • 是否有社区风格指南文档?

  • 这是 Postgres 独有的,还是同样适用于 SQL?

抱歉所有问题!

【问题讨论】:

    标签: sql postgresql types casting


    【解决方案1】:

    我可以引用INTERVAL '1 day'作为间隔文字 em>。这意味着,按照书面形式并且没有任何转换,它声明了一个字面 Postgres INTERVAL 值。另一方面,'1 day'::INTERVAL 实际上是文本 1 day 的 cast,使其成为 INTERVAL 值。

    :: 转换语法不是 ANSI 标准的一部分,是 Postgres 特有的。请注意,CAST('1 day' AS INTERVAL) 或多或少与使用双冒号 '1 day'::INTERVAL 语法相同。

    如果您担心必须有一天可能将Postgres SQL代码移植到另一个数据库,那么您可以在大多数其他数据库中支持的前者使用CAST(),以前使用@ 987654329。

    在性能方面,INTERVAL '1 day' 不需要 Postgres 进行任何显式转换操作,而 CAST 或 :: 则需要显式转换。那里可能存在一些小的性能差异。

    【讨论】:

    • 现在看到literal 感觉很傻。那是我在脑海中找不到的词:type literal?‍♂️。感谢您回答其他问题并为他们解答为什么。
    • 请注意,interval '1 day' 是标准 ANSI SQL interval '1' day 的 Postgres 特定变体
    猜你喜欢
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多