RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1583540
Accepted
Виталий Яндулов
Виталий Яндулов
Asked:2024-06-11 17:53:30 +0000 UTC2024-06-11 17:53:30 +0000 UTC 2024-06-11 17:53:30 +0000 UTC

什么时候需要在 Postgres 中指定文字的数据类型?

  • 772

通过查询和视图承包商从 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 中是否存在这种情况变得至关重要的情况?

sql
  • 1 1 个回答
  • 31 Views

1 个回答

  • Voted
  1. Best Answer
    Мелкий
    2024-06-11T21:58:22Z2024-06-11T21:58:22Z

    所有文字最初都被视为unknown一种类型,然后运算符类型解析规则起作用。在这些规则的最后,确实有一个优先考虑将未知作为文本,但只有在只剩下一个合适的文本时才这样。

    a) 丢弃输入类型不匹配且无法转换(使用隐式转换)来匹配的候选运算符。为此目的,假定未知文字可转换为任何内容。如果只剩下一名候选者,则使用它;否则继续下一步。

    b) 如果任何输入参数属于域类型,则在所有后续步骤中将其视为域的基本类型。这确保了域的行为就像其基本类型一样,以解决不明确的运算符。

    c) 遍历所有候选并保留与输入类型最匹配的候选。如果没有完全匹配的候选者,则保留所有候选者。如果只剩下一名候选者,则使用它;否则继续下一步。

    e) 遍历所有候选者,并将那些接受首选类型(输入数据类型的类型类别)的候选者保留在需要类型转换的最多位置。如果没有人接受首选类型,则保留所有候选人。如果只剩下一名候选者,则使用它;否则继续下一步。

    d) 如果任何输入参数未知,请检查其余候选者在这些参数位置接受的类型类别。在每个位置,如果有任何候选者接受该类别,则选择该字符串类别。 (这种对字符串的偏向是适当的,因为未知类型的文字看起来像字符串。)否则,如果所有剩余的候选者都接受相同的类型类别,则选择该类别;否则就会失败,因为没有更多线索就无法推断出正确的选择。现在丢弃不接受所选类型类别的候选者。此外,如果任何候选项接受该类别中的首选类型,则丢弃接受该参数的非首选类型的候选项。如果没有人通过这些测试,则保留所有候选人。如果只剩下一名候选者,则使用它;否则继续下一步。

    f) 如果同时存在未知和已知类型参数,并且所有已知类型参数都具有相同的类型,则假设未知参数也是该类型,并检查哪些候选者可以在未知参数位置接受该类型。如果恰好有一个候选人通过了此测试,请使用它。否则,失败。

    在大多数情况下,您使用二元运算符,其中数据库预先知道其中一个操作数的类型(使用表字段、函数结果和类似情况)。基于运算符和已知类型的操作数之一,通常可以毫无问题地确定第二个操作数的类型。一元运算符的情况更复杂:

    melkij=> select ~ 123;
     ?column? 
    ----------
         -124
    (1 row)
    
    melkij=> select ~ '123';
    ERROR:  operator is not unique: ~ unknown
    LINE 1: select ~ '123';
                   ^
    HINT:  Could not choose a best candidate operator. You might need to add explicit type casts.
    

    哎呀,这里我们不再了解哪个运算符更适合使用。因为它可能不是数字文字,但是,例如inet(甚至以数字开头,但解析器不会去猜测它是否实际上是数字)。

    好吧,完整列出此类情况是不可能的,这就是 postgresql 可扩展性的代价:您可以拥有自己的数据类型和自己的运算符,相应地,可以添加新的替代方案来定义类型。


    通常,除非明确需要,否则不会指定类型。

    • 2

相关问题

  • 通过 OUT 参数从过程结果输出

  • ON 关键字附近的语法错误 - SQL

  • 多表查询中的 Count() 聚合函数

  • 根据时间更改单元格中的日期

  • phpMyAdmin 中的错误 #1064 SQL 查询

  • Qt:包含变量的数据库查询

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5