通过查询和视图承包商从 Oracle 迁移到 PostgreSQL 后,我有以下代码(示例):
AND (lm.lmurre ~~ '%PFE%'::TEXT OR lm.lmurre ~~ '%OTC%'::TEXT)
AND lm.lmurre !~~ '%Tenor%'::TEXT
AND lm.lmurre !~~ '%TN_LMT%'::TEXT
AND lm.lmurre !~~ '%SR%'::TEXT
AND xbu.rienshna <> 'RBB'::TEXT
AND xbu.rienshna !~~ '%ARO%'::TEXT
据我了解,默认情况下文本文字已经是 TEXT 数据类型。问题:如果默认情况下它已经被解释为相同的数据类型,为什么需要指定文字(包括数字)的数据类型?在 Postgres 中是否存在这种情况变得至关重要的情况?
所有文字最初都被视为
unknown一种类型,然后运算符类型解析规则起作用。在这些规则的最后,确实有一个优先考虑将未知作为文本,但只有在只剩下一个合适的文本时才这样。在大多数情况下,您使用二元运算符,其中数据库预先知道其中一个操作数的类型(使用表字段、函数结果和类似情况)。基于运算符和已知类型的操作数之一,通常可以毫无问题地确定第二个操作数的类型。一元运算符的情况更复杂:
哎呀,这里我们不再了解哪个运算符更适合使用。因为它可能不是数字文字,但是,例如
inet(甚至以数字开头,但解析器不会去猜测它是否实际上是数字)。好吧,完整列出此类情况是不可能的,这就是 postgresql 可扩展性的代价:您可以拥有自己的数据类型和自己的运算符,相应地,可以添加新的替代方案来定义类型。
通常,除非明确需要,否则不会指定类型。