OushuDB 用户指南类型转换之函数

简介: OushuDB 用户指南类型转换之函数

bVcWVRC.png


在一次函数调用中使用的特定函数由以下几个步骤决定。

函数类型解析

  1. 从系统表pg_proc中选择要考虑的函数。如果使用了一个不带模式修饰的函数名字, 那么认为该函数是那些在当前搜索路径中名字和参数个数都匹配的函数(参阅  「模式搜索路径」- http://www.oushu.com/docs/ch/...  )。 如果给出一个带修饰的函数名,那么只考虑指定模式中的函数。
    a. 如果搜索路径中找到了多个相同参数类型的函数,那么只考虑最早出现在路径中的那一个。 但是不同参数类型的函数将被平等看待,而不管它们在路径中的位置如何。
  2. 查找精确接受输入参数类型的函数。如果找到一个(在一组被考虑的函数中, 可能只存在一个精确匹配的),则用之。包含unknown类型的函数调用绝不会在此处找到匹配。
  3. 如果没有找到精确的匹配,则看看函数调用是否需要一个特殊的类型转换。 如果函数调用只有一个参数并且函数名与某些数据类型的内部名称相同,那么就会出现这种情况。另外,该函数的参数必须是一个未知类型的文本,或者与某个已命名数据类型二进制兼容。当这些条件满足时,函数参数可以在没有任何实际函数调用的时候转换为已命名的数据类型。
  4. 查找最佳匹配。
    a. 抛弃那些输入类型不匹配并且也不能隐式转换成匹配的候选函数。unknown 文本在这种情况下可以转换成任何东西。如果只剩下一个候选项,则用之,否则继续下一步。
    b. 遍历所有候选函数,保留那些输入类型匹配最准确的。此时, 域被看作和他们的基本类型相同。如果没有一个函数能准确匹配,则保留所有候选。 如果只剩下一个候选项,则用之,否则继续下一步。
    c. 遍历所有候选函数,保留那些需要类型转换时接受(属于输入数据类型的类型范畴的) 首选类型位置最多的函数。如果没有接受首选类型的函数,则保留所有候选。 如果只剩下一个候选项,则用之,否则继续下一步。
    d. 如果有任何输入参数是unknown类型,检查剩余的候选函数对应参数位置的类型范畴。 在每一个能够接受字符串类型范畴的位置使用string类型(这种对字符串的偏爱是合适的, 因为 unknown 文本确实像字符串)。另外,如果所有剩下的候选函数都接受相同的类型范畴, 则选择该类型范畴,否则抛出一个错误(因为在没有更多线索的条件下无法作出正确的选择)。 现在抛弃不接受选定的类型范畴的候选函数,然后,如果任意候选函数在那个范畴接受一个首选类型, 则抛弃那些在该参数位置接受非首选类型的候选函数。
    a. 如果正好一个候选符合,那么使用它。否则,产生一个错误。
    请注意,”最佳匹配”规则对操作符和对函数的类型分析都是一样的。下面是一些例子。
    例.圆整函数参数类型解析
    只有一个round函数有两个参数(第一个是numeric, 第二个是integer)。所以下面的查询自动把第一个类型为integer 的参数转换成numeric类型:
    SELECT round(4, 4);round--------4.0000(1 row)
    实际上它被分析器转换成:
    SELECT round(CAST (4 AS numeric), 4);
    因为带小数点的数值常量初始时被赋予numeric类型, 因此下面的查询将不需要类型转换,并且可能会略微高效一些:
    SELECT round(4.0, 4);
    例.子字符串函数类型解析
    有好几个substr函数,其中一个接受text 和integer类型。如果用一个未声明类型的字符串常量调用它, 系统将选择接受string类型范畴的首选类型 (也就是text类型)的候选函数。
    SELECT substr('1234', 3);substr--------34(1 row)
    如果该字符串声明为varchar类型,就像从表中取出来的数据一样, 分析器将试着将其转换成text类型:
    SELECT substr(varchar '1234', 3);substr--------34(1 row)
    Note
    分析器从pg_cast表中了解到text和varchar 是二进制兼容的,意思是说一个可以传递给接受另一个的函数而不需要做任何物理转换。 因此,在这种情况下,实际上没有做任何类型转换。
    而且,如果以integer为参数调用函数,分析器将试图将其转换成text类型:
    SELECT substr(1234, 3);substr--------34(1 row)
    事实上变成:
    SELECT substr(CAST (1234 AS text), 3);
    这种自动转换可行是因为有一个从integer 到text 的隐式转换。
目录
相关文章
|
数据处理
用if语句实现选择结构
用if语句实现选择结构
164 1
|
机器学习/深度学习 PyTorch 算法框架/工具
神经网络中的分位数回归和分位数损失
在使用机器学习构建预测模型时,我们不只是想知道“预测值(点预测)”,而是想知道“预测值落在某个范围内的可能性有多大(区间预测)”。例如当需要进行需求预测时,如果只储备最可能的需求预测量,那么缺货的概率非常的大。但是如果库存处于预测的第95个百分位数(需求有95%的可能性小于或等于该值),那么缺货数量会减少到大约20分之1。
836 2
|
机器学习/深度学习 数据采集 数据可视化
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
Python实现支持向量机SVM分类模型线性SVM决策过程的可视化项目实战
|
关系型数据库 C语言 PostgreSQL
PostgreSQL服务端开发学习 -- fmgr.h
fmgr按官方的解释就是Postgres函数管理器和函数调用接口,在使用C语言开发PostgreSQL后端应用时,所以与backend交互时必须遵循fmgr.h中定义的一些规范。
|
Java API 区块链
如何在Java中实现智能合约与区块链集成
如何在Java中实现智能合约与区块链集成
|
监控 分布式数据库 API
数据传输DTS同步问题之遇到错误如何解决
数据传输服务(DTS)是一项专注于数据迁移和同步的云服务,在使用过程中可能遇到多种问题,本合集精选常见的DTS数据传输问题及其答疑解惑,以助用户顺利实现数据流转。
Postman - 设置全局请求 header 信息
Postman - 设置全局请求 header 信息
4347 0
Postman - 设置全局请求 header 信息
|
Go 开发工具 Windows
【GO语言】windows下GO语言环境搭建
【2月更文挑战第1天】windows下GO语言环境搭建
405 0
|
JavaScript 前端开发
JavaScript数字方法详解
JavaScript数字方法详解
144 0
|
JavaScript 前端开发 Windows
vue项目中webpack-dev-server的open和host0.0.0.0配置冲突
一个比较老的公司项目,webpack 用的 v3 版本,为了实现localhost、127.0.0.1和本机ip可以同时访问,webpack的devServer里的 host 我们一般会设置成 0.0.0.0,这样本机所有 ipv4 地址都可以实现访问