PostgreSQL为内置数据类型提供了大量的函数和运算符。用户也可以定义自己的函数(参考第11章)。在psql中执行命令/df和/do可以分别列出可用的函数和运算符的列表。
本章中的大部分函数和运算符都是SQL标准中定义的,也有一部分是PostgreSQL自己扩展的。SQL标准定义了一些有特殊语法的字符串函数,这些函数使用特殊关键字而不是逗号来分隔参数,例如from和for。
常用的逻辑运算符有:
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-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 [NOT] 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相同,只是输入表达式必须是布尔类型的。
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) |
正切 |
本节描述用处检查和处理字符串数值的函数和运算符。字符串类型包括类型 character、character varying和 text/除非另外说明,所有下面列出的函数都可以处理这些数据类型,在处理character 类型的时候,要注意它的自动空格填充机制对运算结果的影响。有些函数还可以处理位串类型的数据。表 7-6列出了SQL字符串函数和运算符,表 7-7列出了使用这些运算符的实例。
表 7-6. SQL字符串函数和运算符
函数或运算符 |
返回值类型 |
描述 |
String || string |
text |
连接两个字符串 |
String || non-string 或 non-string || string |
text |
连接一个字符串和另一个非字符串类型的值 |
|
int |
字符串包含的二进制位的个数 |
|
int |
字符串包含的字符的个数 |
|
text |
将字符串转换成小写的格式 |
|
int |
字符串包含的字节的个数 |
|
text |
替换字符串中的子串 |
|
int |
查找子串在字符串中出现的位置 |
|
text |
从字符串中找出指定的子串。from int表示子串开始的位置,默认从1开始,例如from 2表示子串从string的第二个字符开始。for int表示子串的长度,默认取string从子串开始位置到string的末尾的所有子串,例如for 3表示子串的长度是3。 |
|
text |
从字符串中找出匹配POSIX正则表达式的子串,参见第7.7.3节获取模式匹配的详细信息。 |
|
text |
从字符串中找出匹配正则表达式的子串,参见第7.7.3节获取模式匹配的详细信息。 |
|
text |
从字符串string的开始、末尾或者开始和末尾删除只包含指定的字符串characters 中的字符的最长的字符串。 如果没有指定参数characters,则它的值默认是空格。 leading表示只删除字符串头部匹配的子串。 trailing 表示只删除字符串尾部匹配的子串。 both表示同时删除字符串头部和尾部匹配的子串。 |
|
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. 其它的字符串函数
函数 |
返回值类型 |
描述 |
|
int |
参数的第一个字符的ASCII编码。对于UTF8类型的字符串,返回它的第一个字符的UTF-8编码。对于其它的多字节编码类型的字符串,参数的第一个字符必须是ASCII类型的字符。
|
|
text |
从字符串string的开始和末尾删除只包含指定的字符串characters 中的字符的最长的字符串。如果没有指定参数characters,则它的值默认是空格。 |
|
text |
返回指定的编码值对应的字符。参数的值不能是0。参数必须是合法的ASCII编码值或UTF8编码值。 |
|
bytea |
将用 src_encoding编码的字符串转换成用dest_encoding编码的字符串。数据库中必须存在src_encoding到dest_encoding的编码转换函数。表7-10列出了数据库中内置的合法的编码转换组合。 如果数据库中不存在 src_encoding到est_encoding的编码转换函数,可以使用命令 CREATE CONVERSION创建一个。 |
|
text |
将用 src_encoding编码的字符串转换成用数据库当前的编码类型编码的字符串。 |
|
bytea |
将字符串转换成以dest_encoding编码的格式。 |
|
bytea |
从指定的格式的字符串中解码出二进制字符串。格式包括base64、hex和escape,详细信息参考下面的 |
|
text |
将二进制字符串转换成指定的格式字符串。一共有三种格式:base64、hex和escape。关于base64请参考RFC2045,hex是十六进制格式。escape只是用/000来表示字节0,用两个反斜杠来表示一个反斜杠。 |
|
text |
首先将字符串用非字母和数字字符分割成多个子串,然后将每个子串的第一个字符大写,剩下的字符都小写。
|
|
int |
返回字符串中字符的个数 |
|
int |
返回字符串 bytea中的字符的个数,bytea的编码类型必须是encoding指定的。
|
|
text |
用指定的字符串fill将字符串string填充成长度为 length的字符串。如果string的长度已经超过length,则将string截断成长度为length的字符串。 如果没有指定fill的值,则fill的值默认是空格。填充的字符串放在string的头部。 |
|
text |
从字符串string的头部删除只包含指定的字符串characters 中的字符的最长的字符串。 如果没有指定参数characters,则它的值默认是空格。 |
|
text |
计算字符串string的MD5哈希值。结果用十六进制的形式表示。 |
|
name |
返回客户端的当前字符编码类型名称。 |
|
text |
返回字符串string作为合法的SQL标识符的表示形式。 |
|
text |
将字符串string转换成一个合法的SQL语句字符串常量的形式。 |
|
text |
将 value转换成字符串常量,value必须是一个数值。 |
|
setof text[] |
返回所有匹配指定的POSIX正则表达式的子串。参见第7.7.3节。 |
|
text |
用字符串 replacement替换所有匹配指定的POSIX正则表达式的子串。参见第7.7.3节。 |
|
text[] |
使用POSIX正则表达式作为分割符来分割字符串。参见第7.7.3节。 |
|
setof text |
使用POSIX正则表达式作为分割符来分割字符串。参见第7.7.3节。 |
|
text |
将字符串string重复指定的次数。 |
|
text |
将字符串string中的所有子串from用子串to代替。 |
|
text |
用指定的字符串fill将字符串string填充成长度为 length的字符串。如果string的长度已经超过length,则将string截断成长度为length的字符串。 如果没有指定fill的值,则fill的值默认是空格。填充的字符串放在string的尾部。 |
|
text |
从字符串string的尾部删除只包含指定的字符串characters 中的字符的最长的字符串。 如果没有指定参characters,则它的值默认是空格。 |
|
text |
将字符串string用分割符delimiter分成多个域后,返回field指定的域(域的编号从1开始)。delimiter可以是一个字符串。 |
|
int |
返回substring在string中的位置。 |
|
text |
从字符串string中取出指定的子串,如果没有指定参数count,则取出从from到字符串结尾这部分子串。与函数substring(string from from for count) 的功能相同。 |
|
text |
将用 ASCII表示的字符串转换成其它编码类型的字符串(只支持LATIN1, LATIN2, LATIN9和WIN1250 )。 |
|
text |
将数字转换成十六进制的表示形式。 |
|
text |
如果字符串string中的某个字符匹配字符串from的某个字符,则string中的这个字符将用字符串to中和from中的匹配字符对应的字符代替。字符串to和from的长度应该相等,如果不相等,参见例子中的处理方式。 |
表 7-9. 其它的字符串函数实例
例子 |
结果 |
(1)ascii('x') (2) (3) |
(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', '.[mN]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 |
本节描述处理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(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 |
本节描述用于处理位串类型数据的函数和运算符。位串类型包括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),结果只会取整数的最右边的那个二进制位。