dong5300 发表于 2016-11-20 10:58:50

PostgreSQL函数和运算符(一)

  PostgreSQL为内置数据类型提供了大量的函数和运算符。用户也可以定义自己的函数(参考第11章)。在psql中执行命令/df和/do可以分别列出可用的函数和运算符的列表。
本章中的大部分函数和运算符都是SQL标准中定义的,也有一部分是PostgreSQL自己扩展的。SQL标准定义了一些有特殊语法的字符串函数,这些函数使用特殊关键字而不是逗号来分隔参数,例如from和for。
7.1 逻辑运算符
   常用的逻辑运算符有:
AND
OR
NOT
SQL 使用三值的布尔逻辑,空值代表"unknown"。 下面逻辑运算符的真值表:
a
b
a AND b
a OR b
TRUE
TRUE
TRUE
TRUE
TRUE
FALSE
FALSE
TRUE
TRUE
NULL
NULL
TRUE
FALSE
FALSE
FALSE
FALSE
FALSE
NULL
FALSE
NULL
NULL
NULL
NULL
NULL
a
NOT a

TRUE
FALSE

FALSE
TRUE

NULL
NULL


运算符 AND 和 OR 满足交换律。

7.2 比较运算符
表 7-1 列出了所有的比较运算符。
表7-1 比较运算符
运算符
描述
<
小于
>
大于
<=
小于或等于
>=
大于或等于
=
等于
<> 或 !=
不等于
注意: != 运算符在进行此法分析时会被自动转换成 <>。所以不可能让!= 和 <> 实现不同的功能。
比较运算符可以用于所有可以进行比较的操作的数据类型。所有比较运算符都是二元运算符,返回 boolean 类型的结果,类似“1 < 2 < 3” 这样的表达式是非法的。
除了比较运算符,还可以使用 BETWEEN谓词。 a BETWEEN x AND y 等价于
a >= x AND a <= y。类似地,a NOT BETWEEN x AND y 等价于 a < x OR a > y。
这两种形式之间没有什么区别。使用BETWEEN谓词时要注意,AND左边的操作数应该小于或等于它右边的操作数,否则可能会得到意想不到的结果,例如:
(1)select 3 between 4 and 2;
?column?
----------
f --结果为假
(1 row)
(2)select 3 between 2 and 4;
?column?
----------
t --结果为真
(1 row)

BETWEEN SYMMETRIC和BETWEEN的功能类似,但是在使用BETWEEN SYMMETRIC时,AND运算符左边的操作数不一定要小于或者等于它右边的操作数。例如:
(1)select 3 between symmetric 2 and 4;
?column?
----------
t --结果为真
(1 row)
(2)select 3 between symmetric 4 and 2;
?column?
----------
t --结果为真
(1 row)
要检查一个值是否是空值,使用下面的语法:
expression IS NULL
expression IS NOT NULL
或者使用下面的等价的但并不标准的语法
expression ISNULL
expression NOTNULL
不能写成expression = NULL,因为两个空值是不相等的。空值代表一个未知的数值,因此无法决定两个未知的数值是否相等,这个规则符合SQL 标准。

注意:如果表达式返回一个复合数据类型的值,只有在这个值是空值或者这个值的所有域都是空值的情况下,IS NULL才返回“真”。只有在这个值不是空值和这个值的所有域的值都不是空值的情况下,IS NOT NULL才返回“真”。这个规则是SQL标准定义的。

如果有任何一个操作数是空值,普通的比较运算符的运算结果也是空值(表示"未知")。
还可以用IS DISTINCT FROM 来比较两个表达式的值,语法如下:
expression IS DISTINCT FROM expression
expression IS NOT DISTINCT FROM expression
如果两个表达式都不是空值,IS DISTINCT FROM的功能与运算符“<>”完全相同。 但是,假如两个表达式的值都是空值,IS DISTINCT FROM将返回“假”,而如果只有一个表达式的值是空值,那么它将返回“真”。
如果两个表达式都不是空值,IS NOT DISTINCT FROM的功能与运算符“=”完全相同。但是,假如两个表达式的值都是空值,IS NOT DISTINCT FROM将返回“真“,而如果只有一个表达式的值是空值,那么它将返回“假”。
可以使用下面的谓词来测试布尔类型的数值:
expression IS TRUE
expression IS NOT TRUE
expression IS FALSE
expression IS NOT FALSE
expression IS UNKNOWN
expression IS NOT UNKNOWN
上面的谓词总是返回真或假,从来不返回空值。空值输入被当做逻辑数值"未知"(UNKNOWN)。注意IS UNKNOWN和 IS NOT UNKNOWN分别与IS NULL和IS NOT NULL相同,只是输入表达式必须是布尔类型的。

7.3 数学函数和运算符
PostgreSQL为许多类型提供了数学运算符。表 7-2 列出了所有的数学运算符。
表 7-2. 数学运算符
运算符
描述
例子
结果
+

2 + 3
5
-

2 - 3
-1
*

2 * 3
6
/
除 (两个整数相除的结果如果不是整数,会将结果的小数部分去掉,只保留整数部分)
(1)4 / 2
(2)3/2
(3)2/4
(1)2
(2)1
(3)0
%
模除 (求余)
5 % 4
1
^
幂(指数运算)
2.0 ^ 3.0
8
|/
平方根
|/ 25.0
5
||/
立方根
||/ 27.0
3
!
阶乘
5 !
120
!!
阶乘 (前缀运算符)
!! 5
120
@
绝对值
@ -5.0
5
&
按位 AND
91 & 15
11
|
按位OR
32 | 3
35
#
按位XOR
17 # 5
20
~
按位NOT
~1
-2
<<
按位左移
1 << 4
16
>>
按位右移
8 >> 2
2

按位运算运算符只能用于整数类型的数据,而其它的运算符可以用于所有的数值类型的数据。按位运算的运算符还可以用于位串类型 bit 和 bit varying,如表7-3所示。
表7-3列出了所有的数学函数。在该表中dp表示double precision,除非特别指明,函数的返回值的数据类型和它的参数的数据类型相同。表7-4列出了这些数学函数的实例。处理 double precision 数据的函数大多数是在操作系统的C函数库的基础上实现的。
表7-3. 数学函数
函数
返回值类型
描述
abs(x)
和x类型相同
绝对值
cbrt(dp)
Dp
立方根
ceil(dp 或者 numeric)
与输入相同
不小于参数的最小的整数
ceiling(dp or numeric)
与输入相同
不小于参数的最小整数(ceil 的别名)
degrees(dp)
dp
把弧度转为角度
exp(dp 或 numeric)
与输入相同
自然指数
floor(dp 或 numeric)
与输入相同
不大于参数的最大整数
ln(dp 或 numeric)
与输入相同
自然对数
log(dp 或 numeric)
与输入相同
10 为底的对数
log(b numeric, x numeric)
numeric
指定底数的对数
mod(y, x)
和参数类型相同
除法 y/x 的余数(模)
pi()
Dp
"π" 常量
power(a dp, b dp)
Dp
求a的 b 次幂
power(a numeric, b numeric)
numeric
求a的 b 次幂
radians(dp)
Dp
把角度转为弧度
random()
Dp
0.0 到 1.0 之间的随机数值
round(dp 或者 numeric)
与输入相同
约为最接近参数的整数
round(v numeric, s int)
Numeric
约为最接近参数的有s位小数的数字
setseed(dp)
Int
为以后被调用的 random()函数设置种子
sign(dp 或者 numeric)
和输入相同
参数的符号(-1, 0, +1)
sqrt(dp 或者 numeric)
和输入相同
平方根
trunc(dp 或者 numeric)
和输入相同
去掉参数的小数位
trunc(v numeric, s int)
Numeric
将参数截断为含有 s位小数的数字
width_bucket(op numeric, b1 numeric, b2 numeric, count in)
Int
将b1和b2平分成count个取值区间,取值区间的编号从1开始。

如果b1>b2,则编号为0的取值区间表示的范围是(b1,正无穷大),编号为count+1的取值区间表示的范围是(负无穷大,b2)。

如果b1<b2,则编号为0的取值区间表示的范围是(负无穷大,b1),编号为count+1的取值区间表示的范围是(b2,负无穷大)。

若op落在某个取值区间内,则返回该取值区间的编号。
width_bucket(op dp, b1 dp, b2 dp, count int)
Int
函数功能同上
表7-4. 数学函数实例
例子
结果
abs(-17.4)
17.4
cbrt(27.0)
3
ceil(-42.8)
-42
ceiling(-95.3)
-95
degrees(0.5)
28.6478897565412
exp(1.0)
2.71828182845905
floor(-42.8)
-43
ln(2.0)
0.693147180559945
log(100.0)
2
log(2.0, 64.0)
6.0000000000
mod(9,4)
1
pi()
3.14159265358979
power(9.0, 3.0)
729
power(9.0, 3.0)
729
radians(45.0)
0.785398163397448
random()
每次调用的结果是随机的,例如0.453876388259232
(1)round(42.4)
(2)round(42.8)
(1)42
(2)43
(1)round(42.4382, 2)
(2)round(42.4322,2)
(1)42.44
(2)42.43
setseed(0.54823)
1177314959
sign(-8.4)
-1
sqrt(2.0)
1.4142135623731
trunc(42.8)
42
(1)trunc(42.4382, 2)
(2)trunc(42,2)
(1)42.43
(2)42.00
(1)width_bucket(0.7,1,4,2);

(2)width_bucket(10,1,4,2);

(3)width_bucket(10,4,1,2);

(3)width_bucket(3,4,1,2);
(1)0

(2)3

(3)0

(4)1
width_bucket(0.35, 0.024, 10.06, 5)
1

表7-5列出了所有的三角函数。所有三角函数的参数类型和返回值的类型都是double precision。
表7-5. 三角函数
函数
描述
acos(x)
反余弦
asin(x)
反正弦
atan(x)
反正切
atan2(x, y)
正切 y/x 的反函数
cos(x)
余弦
cot(x)
余切
sin(x)
正弦
tan(x)
正切


7.4 字符串函数和运算符
本节描述用处检查和处理字符串数值的函数和运算符。字符串类型包括类型 character、character varying和 text/除非另外说明,所有下面列出的函数都可以处理这些数据类型,在处理character 类型的时候,要注意它的自动空格填充机制对运算结果的影响。有些函数还可以处理位串类型的数据。表 7-6列出了SQL字符串函数和运算符,表 7-7列出了使用这些运算符的实例。
  表 7-6. SQL字符串函数和运算符
函数或运算符
返回值类型
描述
String || string
text
连接两个字符串
String || non-string 或
non-string || string
text
连接一个字符串和另一个非字符串类型的值
bit_length(string)
int
字符串包含的二进制位的个数
char_length(string) 或character_length(string)
int
字符串包含的字符的个数
lower(string)
text
将字符串转换成小写的格式
octet_length(string)
int
字符串包含的字节的个数
overlay(string placing string from int [for int])
text
替换字符串中的子串
position(substring in string)
int
查找子串在字符串中出现的位置
substring(string [from int] [for int])
text
从字符串中找出指定的子串。from int表示子串开始的位置,默认从1开始,例如from 2表示子串从string的第二个字符开始。for int表示子串的长度,默认取string从子串开始位置到string的末尾的所有子串,例如for 3表示子串的长度是3。
substring(string from pattern)
text
从字符串中找出匹配POSIX正则表达式的子串,参见第7.7.3节获取模式匹配的详细信息。
substring(string from pattern for escape)
text
从字符串中找出匹配正则表达式的子串,参见第7.7.3节获取模式匹配的详细信息。
trim([leading | trailing | both] from string)
text
从字符串string的开始、末尾或者开始和末尾删除只包含指定的字符串characters 中的字符的最长的字符串。
如果没有指定参数characters,则它的值默认是空格。
leading表示只删除字符串头部匹配的子串。
trailing 表示只删除字符串尾部匹配的子串。
both表示同时删除字符串头部和尾部匹配的子串。
upper(string)
text
将字符串转换成大写的格式
  表 7-7. SQL字符串函数和运算符实例
例子
结果
'Post' || 'greSQL'
PostgreSQL
'Value: ' || 42
Value: 42
bit_length('jose')
32
char_length('jose')
4
lower('TOM')
tom
octet_length('jose')
4
Overlay('Txxxxas' placing 'hom' from 2 for 4)
Thomas
position('om' in 'Thomas')
3
(1)substring('Thomas' from 2 for 3)
(2)substring('Thomas' from 1 for 1)
(3)substring('Thomas' from 2)
(1)hom
(2)T
(3)homas
substring('Thomas' from '...$')
mas
substring('Thomas' from '%#"o_a#"_' for '#')
oma
(1)trim(both 'x' from 'xTomxx')

(2)trim(both 'xf' from 'xTomxxf');

(3)trim(both 'gxf' from 'xgTxTomxxf');

(4)trim(both from ' xgTxTomxxf ');

(5)trim(leading 'xf' from 'xTomxxf')
(1)Tom
(2)Tom
(3)TxTom
(4)xgTxTomxxf
(5)Tomxxf
upper('tom')
TOM
  
   还有其它的字符串运算函数可以用,表7-8列出了这些函数。它们有些在内部用于实现表7-6列出的SQL标准字符串函数。表7-9列出了表7-8中的函数实例。
  表 7-8. 其它的字符串函数
  
函数
返回值类型
描述
ascii(string)
int
参数的第一个字符的ASCII编码。对于UTF8类型的字符串,返回它的第一个字符的UTF-8编码。对于其它的多字节编码类型的字符串,参数的第一个字符必须是ASCII类型的字符。

btrim(string text [, characters text])
text
从字符串string的开始和末尾删除只包含指定的字符串characters 中的字符的最长的字符串。如果没有指定参数characters,则它的值默认是空格。
chr(int)
text
返回指定的编码值对应的字符。参数的值不能是0。参数必须是合法的ASCII编码值或UTF8编码值。
convert(string bytea, src_encoding name, dest_encoding name)
bytea
将用 src_encoding编码的字符串转换成用dest_encoding编码的字符串。数据库中必须存在src_encoding到dest_encoding的编码转换函数。表7-10列出了数据库中内置的合法的编码转换组合。
如果数据库中不存在 src_encoding到est_encoding的编码转换函数,可以使用命令 CREATE CONVERSION创建一个。
convert_from(string bytea, src_encoding name)
text
将用 src_encoding编码的字符串转换成用数据库当前的编码类型编码的字符串。
convert_to(string text, dest_encoding name)
bytea
将字符串转换成以dest_encoding编码的格式。
decode(string text, type text)
bytea
从指定的格式的字符串中解码出二进制字符串。格式包括base64、hex和escape,详细信息参考下面的encode函数。
encode(data bytea, type text)
text
将二进制字符串转换成指定的格式字符串。一共有三种格式:base64、hex和escape。关于base64请参考RFC2045,hex是十六进制格式。escape只是用/000来表示字节0,用两个反斜杠来表示一个反斜杠。
initcap(string)
text
首先将字符串用非字母和数字字符分割成多个子串,然后将每个子串的第一个字符大写,剩下的字符都小写。

length(string)
int
返回字符串中字符的个数
length(string bytea, encoding name )
int
返回字符串 bytea中的字符的个数,bytea的编码类型必须是encoding指定的。

lpad(string text, length int [, fill text])
text

用指定的字符串fill将字符串string填充成长度为 length的字符串。如果string的长度已经超过length,则将string截断成长度为length的字符串。
如果没有指定fill的值,则fill的值默认是空格。填充的字符串放在string的头部。
ltrim(string text [, characters text])
text
从字符串string的头部删除只包含指定的字符串characters 中的字符的最长的字符串。
如果没有指定参数characters,则它的值默认是空格。
md5(string)
text
计算字符串string的MD5哈希值。结果用十六进制的形式表示。
pg_client_encoding()
name
返回客户端的当前字符编码类型名称。
quote_ident(string text)
text
返回字符串string作为合法的SQL标识符的表示形式。
quote_literal(string text)
text
将字符串string转换成一个合法的SQL语句字符串常量的形式。
quote_literal(value anyelement)
text
将 value转换成字符串常量,value必须是一个数值。
regexp_matches(string text, pattern text [, flags text])
setof text[]
返回所有匹配指定的POSIX正则表达式的子串。参见第7.7.3节。
regexp_replace(string text, pattern text, replacement text [, flags text])
text
用字符串 replacement替换所有匹配指定的POSIX正则表达式的子串。参见第7.7.3节。
regexp_split_to_array(string text, pattern text [, flags text ])
text[]
使用POSIX正则表达式作为分割符来分割字符串。参见第7.7.3节。
regexp_split_to_table(string text, pattern text [, flags text])
setof text
使用POSIX正则表达式作为分割符来分割字符串。参见第7.7.3节。
repeat(string text, number int)
text
将字符串string重复指定的次数。
replace(string text, from text, to text)
text
将字符串string中的所有子串from用子串to代替。
rpad(string text, length int [, fill text])
text
用指定的字符串fill将字符串string填充成长度为 length的字符串。如果string的长度已经超过length,则将string截断成长度为length的字符串。
如果没有指定fill的值,则fill的值默认是空格。填充的字符串放在string的尾部。
rtrim(string text [, characters text])
text
从字符串string的尾部删除只包含指定的字符串characters 中的字符的最长的字符串。
如果没有指定参characters,则它的值默认是空格。
split_part(string text, delimiter text, field int)
text
将字符串string用分割符delimiter分成多个域后,返回field指定的域(域的编号从1开始)。delimiter可以是一个字符串。
strpos(string, substring)
int
返回substring在string中的位置。
substr(string, from [, count] int)
text
从字符串string中取出指定的子串,如果没有指定参数count,则取出从from到字符串结尾这部分子串。与函数substring(string from from for count) 的功能相同。
to_ascii(string text [, encoding text])
text
将用 ASCII表示的字符串转换成其它编码类型的字符串(只支持LATIN1, LATIN2, LATIN9和WIN1250 )。
to_hex(number int or bigint)
text
将数字转换成十六进制的表示形式。
translate(string text, from text, to text)
text
如果字符串string中的某个字符匹配字符串from的某个字符,则string中的这个字符将用字符串to中和from中的匹配字符对应的字符代替。字符串to和from的长度应该相等,如果不相等,参见例子中的处理方式。
  表 7-9. 其它的字符串函数实例
例子
结果
(1)ascii('x')
(2)ascii('yz')
(3)ascii('我是')
(1)120
(2)121
(3)25105
(1)btrim('xyxtrimyyx', 'xy')
(2)btrim('xgTomxxf','gxf');
(1)trim
(2)Tom
(1)chr(65)
(2)chr(25105)
(3)chr(25104)
(1)A
(2)我
(3)成
convert('text_in_utf8', 'UTF8', 'LATIN1')
用ISO 8859-1格式表示的字符串text_in_utf8
convert_from('text_in_utf8', 'UTF8')
用数据库当前的编码类型表示的字符串text_in_utf8
convert_to('some text', 'UTF8')
用UTF8编码的字符串
(1)decode(‘MTIzAAE=', 'base64')
(2)decode('3132330001','hex')
(1)123/000/001
(2)123/000/001
(1)encode(E'123//000//001', 'base64')
(2)encode(E'123//000//001', 'hex')
(1)MTIzAAE=
(2)3132330001
(1)initcap('hi THOMAS')
(2)initcap('hh+jj');
(1)Hi Thomas
(2)Hh+Jj
(1)length('jose')
(2)length('我是谁')
(1)4
(2)3
length('jose', 'UTF8')
4
(1)lpad('hi', 5, 'xy')
(2)lpad('gggggg',4,'h');
(3)lpad('gg',4,'h');
(4)lpad('gg',4);
(1)xyxhi
(2)gggg
(3)hhgg
(4) gg,注意gg前面是两个空格。
ltrim('zzzytrim', 'xyz')
trim
md5('abc')
900150983cd24fb0 d6963f7d28e17f72
pg_client_encoding()
GB18030
(1)quote_ident('Foo bar')
(2)quote_ident('abc')
(3)quote_ident('abc''');
(1)"Foo bar"
(2)abc
(3) "abc'"
(1)quote_literal('O/'Reilly')
(2)quote_literal('abc//');
(1)'O''Reilly'
(2) E'abc//'
quote_literal(42.5)
'42.5'
regexp_matches('foobarbequebaz', '(bar)(beque)')
{bar,beque}
regexp_replace('Thomas', '.a.', 'M')
ThM
regexp_split_to_array('hello world', E'//s+')
{hello,world}
regexp_split_to_table('hello world', E'//s+')
hello
world
(2 rows)
repeat('Pg', 4)
PgPgPgPg
replace('abcdefabcdef', 'cd', 'XX')
abXXefabXXef
rpad('hi', 5, 'xy')
hixyx
rtrim('trimxxxx', 'x')
trim
(1)split_part('abc~@~def~@~ghi', '~@~', 2)
(2)split_part('abc$de$f','$',3);
(1)def
(2)f
(1)strpos('high', 'ig')
(2)strpos('我是','是')
(1)2
(2)2
substr('alphabet', 3, 2)
ph
to_ascii('Karel')
Karel
to_hex(2147483647)
7fffffff
(1)translate('12345', '14', 'ax')
(2)translate('abcdef','abc','f')
(3)translate('abcdef','abc','fg')
(1)a23x5
(2)fdef
(3)fgdef
  表 7-10. 系统内置的编码类型转换
编码类型转换名称
源编码类型
目标编码类型
ascii_to_mic
SQL_ASCII
MULE_INTERNAL
ascii_to_utf8
SQL_ASCII
UTF8
big5_to_euc_tw
BIG5
EUC_TW
big5_to_mic
BIG5
MULE_INTERNAL
big5_to_utf8
BIG5
UTF8
euc_cn_to_mic
EUC_CN
MULE_INTERNAL
euc_cn_to_utf8
EUC_CN
UTF8
euc_jp_to_mic
EUC_JP
MULE_INTERNAL
euc_jp_to_sjis
EUC_JP
SJIS
euc_jp_to_utf8
EUC_JP
UTF8
euc_kr_to_mic
EUC_KR
MULE_INTERNAL
euc_kr_to_utf8
EUC_KR
UTF8
euc_tw_to_big5
EUC_TW
BIG5
euc_tw_to_mic
EUC_TW
MULE_INTERNAL
euc_tw_to_utf8
EUC_TW
UTF8
gb18030_to_utf8
GB18030
UTF8
gbk_to_utf8
GBK
UTF8
iso_8859_10_to_utf8
LATIN6
UTF8
iso_8859_13_to_utf8
LATIN7
UTF8
iso_8859_14_to_utf8
LATIN8
UTF8
iso_8859_15_to_utf8
LATIN9
UTF8
iso_8859_16_to_utf8
LATIN10
UTF8
iso_8859_1_to_mic
LATIN1
MULE_INTERNAL
iso_8859_1_to_utf8
LATIN1
UTF8
iso_8859_2_to_mic
LATIN2
MULE_INTERNAL
iso_8859_2_to_utf8
LATIN2
UTF8
iso_8859_2_to_windows_1250
LATIN2
WIN1250
iso_8859_3_to_mic
LATIN3
MULE_INTERNAL
iso_8859_3_to_utf8
LATIN3
UTF8
iso_8859_4_to_mic
LATIN4
MULE_INTERNAL
iso_8859_4_to_utf8
LATIN4
UTF8
iso_8859_5_to_koi8_r
ISO_8859_5
KOI8
iso_8859_5_to_mic
ISO_8859_5
MULE_INTERNAL
iso_8859_5_to_utf8
ISO_8859_5
UTF8
iso_8859_5_to_windows_1251
ISO_8859_5
WIN1251
iso_8859_5_to_windows_866
ISO_8859_5
WIN866
iso_8859_6_to_utf8
ISO_8859_6
UTF8
iso_8859_7_to_utf8
ISO_8859_7
UTF8
iso_8859_8_to_utf8
ISO_8859_8
UTF8
iso_8859_9_to_utf8
LATIN5
UTF8
johab_to_utf8
JOHAB
UTF8
koi8_r_to_iso_8859_5
KOI8
ISO_8859_5
koi8_r_to_mic
KOI8
MULE_INTERNAL
koi8_r_to_utf8
KOI8
UTF8
koi8_r_to_windows_1251
KOI8
WIN1251
koi8_r_to_windows_866
KOI8
WIN866
mic_to_ascii
MULE_INTERNAL
SQL_ASCII
mic_to_big5
MULE_INTERNAL
BIG5
mic_to_euc_cn
MULE_INTERNAL
EUC_CN
mic_to_euc_jp
MULE_INTERNAL
EUC_JP
mic_to_euc_kr
MULE_INTERNAL
EUC_KR
mic_to_euc_tw
MULE_INTERNAL
EUC_TW
mic_to_iso_8859_1
MULE_INTERNAL
LATIN1
mic_to_iso_8859_2
MULE_INTERNAL
LATIN2
mic_to_iso_8859_3
MULE_INTERNAL
LATIN3
mic_to_iso_8859_4
MULE_INTERNAL
LATIN4
mic_to_iso_8859_5
MULE_INTERNAL
ISO_8859_5
mic_to_koi8_r
MULE_INTERNAL
KOI8
mic_to_sjis
MULE_INTERNAL
SJIS
mic_to_windows_1250
MULE_INTERNAL
WIN1250
mic_to_windows_1251
MULE_INTERNAL
WIN1251
mic_to_windows_866
MULE_INTERNAL
WIN866
sjis_to_euc_jp
SJIS
EUC_JP
sjis_to_mic
SJIS
MULE_INTERNAL
sjis_to_utf8
SJIS
UTF8
tcvn_to_utf8
WIN1258
UTF8
uhc_to_utf8
UHC
UTF8
utf8_to_ascii
UTF8
SQL_ASCII
utf8_to_big5
UTF8
BIG5
utf8_to_euc_cn
UTF8
EUC_CN
utf8_to_euc_jp
UTF8
EUC_JP
utf8_to_euc_kr
UTF8
EUC_KR
utf8_to_euc_tw
UTF8
EUC_TW
utf8_to_gb18030
UTF8
GB18030
utf8_to_gbk
UTF8
GBK
utf8_to_iso_8859_1
UTF8
LATIN1
utf8_to_iso_8859_10
UTF8
LATIN6
utf8_to_iso_8859_13
UTF8
LATIN7
utf8_to_iso_8859_14
UTF8
LATIN8
utf8_to_iso_8859_15
UTF8
LATIN9
utf8_to_iso_8859_16
UTF8
LATIN10
utf8_to_iso_8859_2
UTF8
LATIN2
utf8_to_iso_8859_3
UTF8
LATIN3
utf8_to_iso_8859_4
UTF8
LATIN4
utf8_to_iso_8859_5
UTF8
ISO_8859_5
utf8_to_iso_8859_6
UTF8
ISO_8859_6
utf8_to_iso_8859_7
UTF8
ISO_8859_7
utf8_to_iso_8859_8
UTF8
ISO_8859_8
utf8_to_iso_8859_9
UTF8
LATIN5
utf8_to_johab
UTF8
JOHAB
utf8_to_koi8_r
UTF8
KOI8
utf8_to_sjis
UTF8
SJIS
utf8_to_tcvn
UTF8
WIN1258
utf8_to_uhc
UTF8
UHC
utf8_to_windows_1250
UTF8
WIN1250
utf8_to_windows_1251
UTF8
WIN1251
utf8_to_windows_1252
UTF8
WIN1252
utf8_to_windows_1253
UTF8
WIN1253
utf8_to_windows_1254
UTF8
WIN1254
utf8_to_windows_1255
UTF8
WIN1255
utf8_to_windows_1256
UTF8
WIN1256
utf8_to_windows_1257
UTF8
WIN1257
utf8_to_windows_866
UTF8
WIN866
utf8_to_windows_874
UTF8
WIN874
windows_1250_to_iso_8859_2
WIN1250
LATIN2
windows_1250_to_mic
WIN1250
MULE_INTERNAL
windows_1250_to_utf8
WIN1250
UTF8
windows_1251_to_iso_8859_5
WIN1251
ISO_8859_5
windows_1251_to_koi8_r
WIN1251
KOI8
windows_1251_to_mic
WIN1251
MULE_INTERNAL
windows_1251_to_utf8
WIN1251
UTF8
windows_1251_to_windows_866
WIN1251
WIN866
windows_1252_to_utf8
WIN1252
UTF8
windows_1256_to_utf8
WIN1256
UTF8
windows_866_to_iso_8859_5
WIN866
ISO_8859_5
windows_866_to_koi8_r
WIN866
KOI8
windows_866_to_mic
WIN866
MULE_INTERNAL
windows_866_to_utf8
WIN866
UTF8
windows_866_to_windows_1251
WIN866
WIN
windows_874_to_utf8
WIN874
UTF8
euc_jis_2004_to_utf8
EUC_JIS_2004
UTF8
ut8_to_euc_jis_2004
UTF8
EUC_JIS_2004
shift_jis_2004_to_utf8
SHIFT_JIS_2004
UTF8
ut8_to_shift_jis_2004
UTF8
SHIFT_JIS_2004
euc_jis_2004_to_shift_jis_2004
EUC_JIS_2004
SHIFT_JIS_2004
shift_jis_2004_to_euc_jis_2004
SHIFT_JIS_2004
EUC_JIS_2004
  
7.5 二进制字符串函数和运算符
本节描述处理bytea类型的数值的函数和运算符。表7-11列出了这些函数和运算符,表7-12列出了这些函数和运算符的实例。表7-13中列出了其它的二进制字符串处理函数,这些函数有一些在内部使用,用来实现表7-11中列出的SQL标准的二进制字符串函数的,表7-14列出了表7-13中函数的实例。
表7-11. 二进制字符串函数和运算符
函数
返回值类型
描述
string || string
bytea
连接两个二进制字符串
get_bit(string, offset)
int
从二进制字符串中找出一个指定的二进制位
get_byte(string, offset)
int
从二进制字符串中找出一个指定的字节
octet_length(string)
int
二进制字符串含有的字节的个数
position(substring in string)
int
从二进制字符串中找出指定的子串出现的位置
set_bit(string, offset, newvalue)
bytea
将二进制字符串中的某个二进制位设为指定的值
set_byte(string, offset, newvalue)
bytea
将二进制字符串中的某个字节设为指定的值
substring(string [from int] [for int])
bytea
从二进制字符串中中找出指定的子串。from int表示子串开始的位置,默认从1开始,例如from 2表示子串从string的第二个字符开始。for int表示子串的长度,默认取string从子串开始位置到string的末尾的所有子串,例如for 3表示子串的长度是3。
trim([both] bytes from string)
bytea
从二进制字符串string的开始和末尾删除只包含指定的二进制字符串bytes中的字符的最长的二进制字符串。
表7-12. 二进制字符串函数和运算符实例
例子
结果
E'////Post'::bytea || E'//047gres//000'::bytea
//Post'gres/000
get_bit(E'Th//000omas'::bytea, 45)
1
get_byte(E'Th//000omas'::bytea, 4)
109
octet_length(E'jo//000se'::bytea)
5
position(E'//000om'::bytea in E'Th//000omas'::bytea)
3
set_bit(E'Th//000omas'::bytea, 45, 0)
Th/000omAs
set_byte(E'Th//000omas'::bytea, 4, 64)
Th/000o@as
substring(E'Th//000omas'::bytea from 2 for 3)
h/000o
trim(E'//000'::bytea from E'//000Tom//000'::bytea)
Tom

表7-13. 其它二进制字符串函数
函数
返回值类型
描述
btrim(string bytea, bytes bytea)
bytea
从二进制字符串string的开始和末尾删除只包含指定的二进制字符串bytes中的字符的最长的二进制字符串。
decode(string text, type text)
bytea
从指定的格式的字符串中解码出二进制字符串。格式包括base64、hex和escape,详细信息参考下面的encode函数。
encode(string bytea, type text)
text
将二进制字符串转换成指定的格式字符串。一共有三种格式:base64、hex和escape。关于base64请参考RFC2045,hex是十六进制格式。escape只是用/000来表示字节0,用两个反斜杠来表示一个反斜杠。
length(string)
int
返回二进制字符串的长度。
md5(string)
text
计算二进制字符串的MD5哈希值, 结果用十六进制数表示 。
  表7-14. 其它二进制字符串函数实例
例子
结果
btrim(E'//000trim//000'::bytea, E'//000'::bytea)
trim
decode(E'123//000456', 'escape')
123/000456
encode(E'123//000456'::bytea, 'escape')
123/000456
length(E'jo//000se'::bytea)
5
md5(E'Th//000omas'::bytea)
8ab2d3c9689aaf18 b4958c334c82d8b1


7.6 位串函数和运算符
   本节描述用于处理位串类型数据的函数和运算符。位串类型包括bit 和bit varying。对于位串类型的数据可以使用常用的比较运算符,表7-15列出了其它的运算符。运算符&、|和 # 要求两个操作数的长度相等。在对位串类型的数据进行移位操作的时候,位串的长度不会发生变化。
  表7-15.位串运算符
运算符
描述
例子
结果
||
连接
B'10001' || B'011'
10001011
&
按位AND(与)
B'10001' & B'01101'
00001
|
按位OR(或)
B'10001' | B'01101'
11101
#
按位XOR(异或)
B'10001' # B'01101'
11100
~
按位NOT(非)
~ B'10001'
01110
<<
按位左移
B'10001' << 3
01000
>>
按位右移
B'10001' >> 2
00100
   函数length、bit_length、octet_length、position和substring除了用于字符串之外,也可以用于位串。
   此外,可以在整数和位串类型之间进行转换。例如:
44::bit(10) 0000101100
44::bit(3) 100
cast(-44 as bit(12)) 111111010100
'1110'::bit(4)::integer 14

将整数转换成bit(n)类型时,只会取整数的最右边的n个二进制位。注意,如果只是转换为 "bit",意思就是转换成 bit(1),结果只会取整数的最右边的那个二进制位。
页: [1]
查看完整版本: PostgreSQL函数和运算符(一)