PL/SQL

PL/SQL 知识量:16 - 57 - 244

6.7 特殊的转换函数><

数据类型的自动转换- 6.7.1 -

在Oracle数据库中,当函数要对数据进行处理时,会根据实际情况对数据类型进行转换。如果使用字符串函数,则Oracle会立即将date或number转换为字符串,然后该字符串函数就可以工作了。如果遇到了日期函数,而此时数据表列是一个DD-MON-YY格式的字符串,则Oracle会把它转换为date类型。如果使用的是一个数值函数,并且数据表列是一个字符串,则Oracle会首先将其转换为number,然后再计算。

但是,这种自动转换的方法并不是永远都在起作用。如果要使一种数据类型自动转换为另一种数据类型,则需要遵守如下基本的原则:

  • 任何date或number都能转换为字符串。任何字符串都能用于date或number列。number类型和date类型的数据在用于字符串函数时不需要用单引号括起来。

  • 在包含number、小数点的情况下,char或者varchar值可转换为number类型的数据。

  • char或者varchar2值能转换为date类型的数据,只要它的格式是默认格式(DD-MON-YY)。

数值类型、日期类型在函数LPAD中的应用- 6.7.2 -

LPAD函数用于对字符串进行填充,具体是在字符串的左边连接空格或其他字符。语法如下:

lpad   (c1, n,[,c2]);

该函数的功能是在字符串c1的左边用字符串c2填充,直到整个字符串长度为n,其中,c1、c2都是字符串。

SQL> select lpad(sysdate,15,'@') from people where rownum=1;

LPAD(SYSDATE,15,'@')
------------------------------------------------------------
@@@@@07-8月 -23

SQL> select lpad(888,10,'0') from people where rownum=1;

LPAD(888,10,'0')
----------------
0000000888

字符串在数值函数中的自动转换- 6.7.3 -

数值函数FLOOR用于向下取整,返回小于或等于数值类型参数的最大整数。

示例:

SQL> select floor('26.65') from people where rownum=1;

FLOOR('26.65')
--------------
            26

字符串在日期函数中的应用- 6.7.4 -

MONTHS_BETWEEN函数有两个参数,可以获取两个参数之间的月份数。

示例演示日期函数中字符串的自动转换:

SQL> select months_between(to_date('2023-08-07','yyyy-mm-dd'),to_date('2023-02-16','yyyy-mm-dd')) as test from people where rownum=1;

      TEST
----------
5.70967741

注意:date类型的数据不能转换为number类型,而number类型的数据也不能转换为date类型。

自动转换的注意事项- 6.7.5 -

在Oracle数据库中,数据类型的自动转换极大地简化并减少了使用select语句时所必需的函数。

自动的隐式转换的最大问题是转换时列索引是无效的。如果在一个数据表中存在一列是varchar类型,如ID列,然后创建一个存储过程来访问这列数据,并在存储过程中传递一个数,在ID列上建立的索引将不起作用,因此性能会受到影响。

在Oracle数据库中,一个简单的规则是,最好在相对安全的地方使用函数,比如对数值只用字符串处理函数,而不对字符串使用数值函数。

特殊的转换函数- 6.7.6 -

在Oracle数据库中有几个特殊的转换函数,在SQL*Plus更新数据库的过程中,会使用到。转换函数一般接收单个值作为输入,返回一个转换过的值作为输出。常用的特殊的转换函数有如下几个:

  • BIN_TO_NUM函数,可以将二进制数转换为十进制数。它的输入值是一个二进制形式的数字列表,用逗号分隔,作为一个字符串处理。

  • TO_BINARY_DOUBLE函数,将数据值转换为双精度浮点数。

  • TO_BINARY_FLOAT函数,将数据值转换为单精度浮点数。

示例:

SQL> select bin_to_num(1,0,1) from people where rownum=1;

BIN_TO_NUM(1,0,1)
-----------------
                5

SQL> select bin_to_num(1,0,1,0,1,0,1) from people where rownum=1;

BIN_TO_NUM(1,0,1,0,1,0,1)
-------------------------
                       85

TRANSLATE函数- 6.7.7 -

TRANSLATE函数是一个字符串函数,其作用是在字符串中进行逐字符的替换。其语法格式如下:

TRANSLATE(string,if,then);

TRANSLATE查看string中的每个字符,然后检测if以确定该字符是否存在。如果存在,就在if中标出找到字符的位置,接着检查then中相同的位置。TRANSLATE将用then中该位置的字符替换string中相应的字符。如果要转换的字符在if中不存在,则不进行转换。

示例:

SQL> select translate(356984,9854261,'abcdefg') from people where rownum=1;

TRANSLATE(356984,9854261,'ABCDEFG')
-----------------------------------
3cfabd

通过TRANSLATE函数还可以实现一些有趣的功能。

1、获得字符串中的纯字母或纯数字

TRANSALATE函数的典型应用是获得字母与数字混杂的字符串中的纯字母或纯数字。

SQL> select translate('2sadf51e51df256e9g4a','#abcdefghijklmnopqrstuvwxyz',' ') 
     from people where rownum=1;

TRANSLATE('2SADF51E51DF256E9G4A','#ABCDEFGHIJKLMNOPQRSTUVWXYZ','')
------------------------------------------------------------------
2515125694

SQL> select translate('2sadf51e51df256e9g4a','#0123456789',' ') from people where rownum=1;

TRANSLATE('2SADF51E51DF256E9G4A','#0123456789','')
--------------------------------------------------
sadfedfega

以上代码中,第二个参数中包含了26个英文字母(或0~9的数字)和一个额外字符“#”;而第三个参数则仅含有一个空格,该空格总是与“#”对应,其余26个英文字母或(0~9的数字)都将无法成功翻译,实际相当于删除了这些字符。

2、字符串的位移

TRANSLATE函数的另一个大用处是可以在字母表中实现字符的位移。

SQL> select translate('abc','abcdefghijklmnopqrstuvwxyz','bcdefghijklmnopqrstuvwxyza')
     from people where rownum=1;

TRANSLATE('ABC','ABCDEFGHIJKLMNOPQRSTUVWXYZ','BCDEFGHIJKLMNOPQRSTUVWXYZA')
--------------------------------------------------------------------------
bcd