PostgreSQL為內置數據類型提供了大量的函數和運算符。用戶也可以定義自己的函數(參考第11章)。在psql中執行命令/df和/do可以分別列出可用的函數和運算符的列表。
本章中的大部分函數和運算符都是SQL標准中定義的,也有一部分是PostgreSQL自己擴展的。SQL標准定義了一些有特殊語法的字符串函數,這些函數使用特殊關鍵字而不是逗號來分隔參數,例如from和for。
7.1 邏輯運算符
AND |
OR |
NOT |
SQL 使用三值的布爾邏輯,空值代表"unknown"。 下面邏輯運算符的真值表:
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 |
|
NOT a |
|
|||
TRUE |
FALSE |
|
||
FALSE |
TRUE |
|
||
NULL |
NULL |
|
||
運算符 AND 和 OR 滿足交換律。
7.2 比較運算符
運算符 |
描述 |
< |
小於 |
> |
大於 |
<= |
小於或等於 |
>= |
大於或等於 |
= |
等於 |
<> 或 != |
不等於 |
注意: != 運算符在進行此法分析時會被自動轉換成 <>。所以不可能讓!= 和 <> 實現不同的功能。
比較運算符可以用於所有可以進行比較的操作的數據類型。所有比較運算符都是二元運算符,返回 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相同,只是輸入表達式必須是布爾類型的。
7.3 數學函數和運算符
PostgreSQL為許多類型提供了數學運算符。表 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函數庫的基礎上實現的。
函數 |
返回值類型 |
描述 |
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。
函數 |
描述 |
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列出了使用這些運算符的實例。
函數或運算符 |
返回值類型 |
描述 |
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中的函數實例。
函數 |
返回值類型 |
描述 |
|
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的長度應該相等,如果不相等,參見例子中的處理方式。 |
例子 |
結果 |
(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 |
7.5 二進制字符串函數和運算符
本節描述處理bytea類型的數值的函數和運算符。表7-11列出了這些函數和運算符,表7-12列出了這些函數和運算符的實例。表7-13中列出了其它的二進制字符串處理函數,這些函數有一些在內部使用,用來實現表7-11中列出的SQL標准的二進制字符串函數的,表7-14列出了表7-13中函數的實例。
表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 |
7.6 位串函數和運算符
本節描述用於處理位串類型數據的函數和運算符。位串類型包括bit 和bit varying。對於位串類型的數據可以使用常用的比較運算符,表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),結果只會取整數的最右邊的那個二進制位。
轉載地址:
http://blog.csdn.net/neo_liu0000/article/details/6255303