返回顶部
首页 > 资讯 > 数据库 >PostgreSQL的数据类型转换规则有哪些
  • 931
分享到

PostgreSQL的数据类型转换规则有哪些

2024-04-02 19:04:59 931人浏览 八月长安
摘要

这篇文章主要介绍“postgresql的数据类型转换规则有哪些”,在日常操作中,相信很多人在Postgresql的数据类型转换规则有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大

这篇文章主要介绍“postgresql的数据类型转换规则有哪些”,在日常操作中,相信很多人在Postgresql的数据类型转换规则有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PostgreSQL的数据类型转换规则有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

一、函数

函数调用中依赖的指定函数使用以下过程确定.
Function Type Resolution
1.从pg_proc中选择函数.通常情况下,如果不指定schema,则在当前搜索路径中选择名称&参数个数匹配的,否则将选择指定schema的函数.
a.如在该搜索路径中存在多个相同参数类型的操作符,则选择最早出现的那个.对于具有不同参数类型的操作符,无论搜索路径如何设置,都被认为是平等的.
b.如果函数使用VARIADIC数组参数声明,但调用没有使用VARIADIC关键字,那么数组参数会被替换为数组元素类型的一个或多个值以匹配函数调用.在这样展开后,可能与NON-VARIADIC的函数有相同的参数,在这种情况下,使用搜索路径最终出现的那个,或者使用同一个schema中NON-VARIADIC的那个.
c.有默认参数值的函数会匹配任何省略了零个或多个默认参数位置的函数调用.如果有多个函数匹配,搜索路径中最终出现的那个会被选用.如果在同一个schema中存在两个或以上这样的函数,这时候PG无法选择使用哪个,因此会报错:”ambiguous function call”.
2.检查是否接受输入的参数类型.如存在,则使用此函数.与操作符类似,会有安全上的漏洞.
3.如果没有完全匹配的函数,检查函数调用是否需要类型转换.这会出现在函数调用只有一个参数并且函数名称与内部函数名称一样.此外,函数参数必须是unknown-type literal,或者可binary-coercible为命名数据类型,或者通过I/O函数转换为命名数据类型.如果满足这些条件,那么函数调用会被视为CAST的形式.
4.寻找最佳匹配
参照operator操作符的说明.

下面是一些例子:
Round
round函数在pg_proc中的定义如下:

testdb=# select oid,proname,provariadic,proargtypes,prorettype,prosrc from pg_proc where proname = 'round';
 oid  | proname | provariadic | proargtypes | prorettype |            prosrc             
------+---------+-------------+-------------+------------+-------------------------------
 1342 | round   |           0 | 701         |        701 | dround
 1707 | round   |           0 | 1700 23     |       1700 | numeric_round
 1708 | round   |           0 | 1700        |       1700 | select pg_catalog.round($1,0)
(3 rows)

其中proargtypes是参数类型,prorettype是返回类型,prosrc是函数实现”源码”.
类型23/701/1700定义如下

testdb=# select oid,typname,typalign,typstorage from pg_type where oid in (23,701,1700);
 oid  | typname | typalign | typstorage 
------+---------+----------+------------
   23 | int4    | i        | p
  701 | float8  | d        | p
 1700 | numeric | i        | m
(3 rows)

执行SQL

testdb=# SELECT round(4, 4);
 round  
--------
 4.0000
(1 row)

在pg_proc中,只有一个函数(oid = 1707)有两个参数,第一个参数类型视为numeric,第二个为integer,那么第一个参数4会自动转换为numeric类型,该SQL语句与”SELECT round(CAST (4 AS numeric), 4);”无异.

Variadic
首先定义一个函数variadic_example

testdb=# CREATE FUNCTION public.variadic_example(VARIADIC numeric[]) RETURNS int
testdb-#   LANGUAGE sql AS 'SELECT 1';
CREATE FUNCTION

函数定义

testdb=# select oid,proname,provariadic,proargtypes,prorettype,prosrc from pg_proc where proname = 'variadic_example';
  oid  |     proname      | provariadic | proargtypes | prorettype |  prosrc  
-------+------------------+-------------+-------------+------------+----------
 32787 | variadic_example |        1700 | 1231        |         23 | SELECT 1
(1 row)
testdb=# select oid,typname,typalign,typstorage from pg_type where oid in (1231,1700);
 oid  | typname  | typalign | typstorage 
------+----------+----------+------------
 1231 | _numeric | i        | x
 1700 | numeric  | i        | m
(2 rows)

执行函数,该函数接受可变参数关键字,但不需要指定,可允许整数和数值参数:

testdb=# SELECT public.variadic_example(0),
testdb-#        public.variadic_example(0.0),
testdb-#        public.variadic_example(VARIADIC array[0.0]);
 variadic_example | variadic_example | variadic_example 
------------------+------------------+------------------
                1 |                1 |                1
(1 row)

上述第一次和第二次调用将更倾向明确定义的函数:

testdb=# CREATE FUNCTION public.variadic_example(numeric) RETURNS int
  LANGUAGE sql AS 'SELECT 2';
testdb=# CREATE FUNCTION
testdb=# CREATE FUNCTION public.variadic_example(int) RETURNS int
  LANGUAGE sql AS 'SELECT 3';
testdb=# CREATE FUNCTION
testdb=# SELECT public.variadic_example(0),
testdb-#        public.variadic_example(0.0),
testdb-#        public.variadic_example(VARIADIC array[0.0]);
 variadic_example | variadic_example | variadic_example 
------------------+------------------+------------------
                3 |                2 |                1
(1 row)

Substring
有多个substr函数:

testdb=# select oid,proname,provariadic,proargtypes,prorettype,prosrc from pg_proc where proname = 'substr';
 oid  | proname | provariadic | proargtypes | prorettype |       prosrc        
------+---------+-------------+-------------+------------+---------------------
  877 | substr  |           0 | 25 23 23    |         25 | text_substr
  883 | substr  |           0 | 25 23       |         25 | text_substr_no_len
 2085 | substr  |           0 | 17 23 23    |         17 | bytea_substr
 2086 | substr  |           0 | 17 23       |         17 | bytea_substr_no_len
(4 rows)
testdb=# select oid,typname,typalign,typstorage from pg_type where oid in (17,23,25);
 oid | typname | typalign | typstorage 
-----+---------+----------+------------
  17 | bytea   | i        | x
  23 | int4    | i        | p
  25 | text    | i        | x
(3 rows)

如未指定参数类型调用函数,系统会优先选择参数为text + int4的函数:

testdb=# SELECT substr('1234', 3);
 substr 
--------
 34
(1 row)

如指定类型为varchar,则转换为text

testdb=# SELECT substr(varchar '1234', 3);
 substr 
--------
 34
(1 row)
testdb=# SELECT substr(CAST (varchar '1234' AS text), 3);
 substr 
--------
 34
(1 row)

如第一个参数为integer,系统无转换函数,则会报错

testdb=# SELECT substr(1234, 3);
psql: ERROR:  function substr(integer, integer) does not exist
LINE 1: SELECT substr(1234, 3);
               ^
HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
testdb=#

到此,关于“PostgreSQL的数据类型转换规则有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: PostgreSQL的数据类型转换规则有哪些

本文链接: https://lsjlt.com/news/63898.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PostgreSQL的数据类型转换规则有哪些
    这篇文章主要介绍“PostgreSQL的数据类型转换规则有哪些”,在日常操作中,相信很多人在PostgreSQL的数据类型转换规则有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • PostgreSQL的数据类型转换规则是什么
    本篇内容介绍了“PostgreSQL的数据类型转换规则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • Oracle vs PostgreSQL,研发注意事项(9)- PostgreSQL数据类型转换规则#1
    PostgreSQL与Oracl...
    99+
    2024-04-02
  • php中布尔类型转换的规则和技巧有哪些
    这篇“php中布尔类型转换的规则和技巧有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php中布尔类型转换的规则和技巧有...
    99+
    2023-07-05
  • C#数据类型转换有哪些
    本篇内容介绍了“C#数据类型转换有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C# 的类型转换有显式转型 和 隐式转型 两种方式。显式...
    99+
    2023-06-26
  • C++ 函数参数类型的转换规则
    c++++ 函数参数类型转换规则包括: 无符号类型转换为有符号类型、精度低的类型转换为精度高的类型、浮点类型之间的转换、兼容的指针类型之间转换。实战案例:可以传递无符号整数、精度低的整数...
    99+
    2024-04-13
    c++ 函数参数类型 隐式类型转换 隐式转换
  • JavaScript数据类型及相互间的转换规则
    目录数据类型的分类非标准特殊对象SymbolBigInt 大数类型数据类型检测数据类型间的相互转换规则Number([val])parseInt([val],[radix]) par...
    99+
    2024-04-02
  • css规则的类型有哪些
    css 规则包括:通用规则:选择所有元素类型选择器:根据元素类型选择元素类选择器:根据元素的 class 属性选择元素id 选择器:根据元素的 id 属性选择元素(唯一)后代选择器:选择...
    99+
    2024-04-25
    css 作用域
  • css规则类型有哪些
    这篇文章主要介绍了css规则类型有哪些的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇css规则类型有哪些文章都会有所收获,下面我们一起来看看吧。 c...
    99+
    2024-04-02
  • Python数据类型转换函数有哪些
    Python数据类型转换函数有:1、int()函数;2、float()函数;3、str()函数;4、list()函数;5、tuple()函数;6、dict()函数;7、set()函数;8、bytes()函数;9、complex()函数。详细...
    99+
    2023-12-12
    数据类型转换函数
  • php数据类型转换的方法有哪些
    这篇文章主要介绍php数据类型转换的方法有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据一共有三种转换类型,分别是强制转换,永久转换,以及转换函数转换。第一种、强制转换通过强制转换的数据,不影响数据原本的类型...
    99+
    2023-06-14
  • numpy转换数据类型的方法有哪些
    numpy转换数据类型的方法有:1、astype()方法,用于将数组转换为指定的数据类型,接受一个参数,即要转换为的数据类型;2、view()方法,创建一个新的数组对象,该对象与原始数组共享相同的数据;3、asarray()函数,可以将数组...
    99+
    2023-11-22
    numpy python
  • Python中的数据类型转换函数有哪些?
    Python是一种强大的编程语言,提供了丰富的数据类型转换函数,方便我们在不同数据类型之间进行转换。本文将介绍Python中常用的数据类型转换函数,并提供相应的代码示例。int()函数:int()函数用于将一个数字或字符串转换为整数。它可以...
    99+
    2023-10-22
    函数 转换 数据类型转换函数:Python
  • Python数据类型转换方式有哪些
    这篇文章主要介绍“Python数据类型转换方式有哪些”,在日常操作中,相信很多人在Python数据类型转换方式有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python数据类型转换方式有哪些”的疑惑有所...
    99+
    2023-06-25
  • php数据类型转换方式有哪些
    在PHP中,可以使用以下方式进行数据类型转换:1. 强制类型转换:使用类型转换运算符(例如 (int)、(float)、(strin...
    99+
    2023-05-13
    php数据类型转换 php
  • 常用的PostgreSQL数据类型有哪些
    PostgreSQL包含以下常用的数据类型: 数值类型:整数(integer)、小数(decimal)、浮点数(float)、双...
    99+
    2023-10-23
    PostgreSQL
  • PostgreSQL支持的数据类型有哪些
    PostgreSQL支持的数据类型包括: 整数类型:包括integer、bigint、smallint等 浮点类型:包括real和...
    99+
    2024-03-12
    PostgreSQL
  • 详解C语言中不同类型的数据转换规则
    不同类型数据间的混合运算与类型转换 1.自动类型转换 在C语言中,自动类型转换遵循以下规则: ①若参与运算量的类型不同,则先转换成同一类型,然后进行运算 ②转换按数据长度增加的方...
    99+
    2024-04-02
  • Pytorch数据类型与转换的方法有哪些
    本篇内容介绍了“Pytorch数据类型与转换的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Pytorch数据类型与转换(torc...
    99+
    2023-07-05
  • python类型转换函数有哪些
    python中的类型转换函数:1.int()函数,将一个字符串或数字转换为整型;2.float()函数,将整数和字符串转换成浮点数;3.str()函数,将对象转化为字符串;python中常用的类型转换函数有以下几种int()函数int()函...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作