C40高中数学什么意思-高中数学公式及定理 公理汇总
tgreSQL学习手册(五) 函数和操作符
阿里云携手开源中国众包平台发布百万悬赏项目 ?
一、逻辑操作符:
常用的逻辑操作符有:AND、OR和NOT。其语义与其它编程语言中的逻辑操作符完
全相同。
二、比较操作符:
下面是PostgreSQL中提供的比较操作符列表:
操作符
<
>
<=
>=
=
!=
描述
小于
大于
小于或等于
大于或等于
等于
不等于
比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符,且返
回boolean类型。除了比较操作符以外,我们还可以使用BETWEEN语句,如:
a
BETWEEN x AND y 等效于 a >= x AND a <= y
a NOT BETWEEN x AND y 等效于 a < x OR a > y
三、 数学函数和操作符:
下面是PostgreSQL中提供的数学操作符列表:
操作符
+
-
*
%
^
|
||
!
!!
@
&
|
描述
加
减
乘
除
模
幂
平方根
立方根
阶乘
阶乘
绝对值
按位AND
按位OR
例子
2 + 3
2 - 3
2 * 3
4
2
5 % 4
2.0 ^ 3.0
|
25.0
|| 27.0
5 !
!! 5
@ -5.0
91 & 15
32 | 3
结果
5
-1
6
2
1
8
5
3
120
120
5
11
35
#
~
<<
>>
按位XOR
按位NOT
按位左移
按位右移
17 # 5
~1
1 << 4
8 >> 2
20
-2
16
2
按位操作符只能用于整数类型,而其它的操作符可以用于全部数值数据类型。按位操作
符还可以用于位串
类型bit和bit varying,
下面是PostgreSQL中提供的数学函数列表
,需要说明的是,这些函数中有许多都存在
多种形式,区别只是参数类型不同。除非特别指明,任何特定
形式的函数都返回和它的参数
相同的数据类型。
函数
abs(x)
cbrt(double)
ceil(doublenumeric)
degrees(double)
exp(doublenumeric)
floor(doublenumeric)
ln(doublenumeric)
log(doublenumeric)
log(b numeric,x
numeric)
mod(y, x)
pi()
power(a numeric, b
numeric)
radians(double)
random()
round(doublenumeric)
round(v numeric,
s int)
sign(doublenumeric)
sqrt(doublenumeric)
trunc(doublenumeric)
trunc(v numeric,
s int)
返回类
型
描述
绝对值
立方根
不小于参数的最小的整
数
把弧度转为角度
自然指数
自然对数
10为底的对数
numeric指定底数的对
数
取余数
例子
abs(-17.4)
cbrt(27.0)
ceil(-42.8)
degrees(0.5)
exp(1.0)
ln(2.0)
log(100.0)
log(2.0,
64.0)
mod(9,4)
pi()
结果
17.4
3
-42
28.6478897565412
2.705
-43
0.6935
2
6.
1
3.979
不大于参数的最大整数
floor(-42.8)
double
常量
power(a double, b double)
double
求a的b次幂
numeric
求a的b次幂
double
把角度转为弧度
double
0.0到1.0之间的随机
数值
圆整为最接近的整数
power(9.0, 3.0)
729
power(9.0,
3.0)
729
radians(45.0)
random()
round(42.4)
0.785398163397448
42
-1
1.41
42
numeric
圆整为s位小数数字
平方根
截断(向零靠近)
round(42.438,2)
42.44
sqrt(2.0)
trunc(42.8)
参数的符号(-1,0,+1)
sign(-8.4)
截断为s小数位置的数
numeric
trunc(42.438,2)
42.43
字
描述
反余弦
三角函数列表:
函数
acos(x)
asin(x)
atan(x)
反正弦
反正切
atan2(x, y)
正切 yx 的反函数
cos(x)
余弦
cot(x)
余切
sin(x)
正弦
tan(x)
正切
四、字符串函数和操作符:
下面是PostgreSQL中提供的字符串操作符列表:
函数
返回
类型
描述
例子
string
|| string
text
字串连接
'Post'
|| 'greSQL'
bit_length(string)
int
字串里二进制位的个数
bit_length('jose')
char_length(string)
int
字串中的字符个数
char_length('jose')
convert(string using
conversion_name)
text
使用指定的转换名字改变编
convert('PostgreSQL' using
码。
iso_8859_1_to_utf8)
lower(string)
text
把字串转化为小写
lower('TOM')
octet_length(string)
int
字串中的字节数
octet_length('jose')
overlay(string placing overlay('Txxxxas'
placing 'hom'
string from int [for int])
text
替换子字串
from 2 for 4)
position(substring in
string)
int
指定的子字串的位置
position('om' in
'Thomas')
substring(string [from
int]
[for int])
text
抽取子字串
substring('Thomas' from 2 for
3)
substring(string from
pattern)
text
抽取匹配 POSIX 正则表达
式的子字串
substring('Thomas' from '...$$')
substring(string from
pattern for
escape)
text
抽取匹配SQL正则表达式的
substring('Thomas' from
子字串
'%#
trim([leading |
trailing |
从字串string的开头结尾
both]
[characters] from text
两边
删除只包含
string)
characters(缺省是一个空
trim(both 'x' from
'xTomxx')
白)的最长的字串
upper(string)
text
把字串转化为大写。
upper('tom')
ascii(text)
int
参数第一个字符的ASCII码
ascii('x')
btrim(string text [,
从string开头和结尾删除只
characters text])
text
包含在characters里(缺省
btrim('xyxtr
imyyx','xy')
是空白)的字符的最长字串
chr(int)
text
给出ASCII码的字符
chr(65)
convert(string text,
[src_encoding name,]
text
把字串转换为
convert( 'text_in_utf8', 'UTF8',
dest_encoding
'LATIN1')
结果
PostgreSQL
32
4
'PostgreSQL'
tom
4
Thomas
3
hom
mas
oma
Tom
TOM
120
trim
A
以ISO
8859-1编
码表示的
dest_encoding
name)
把每个单词的第一个子母转
initcap(text)
为大写,其它的保留小写。
text
initcap('hi
thomas')
单词是一系列字母数字组成
的字符,用非字母数字分隔。
length(string text)
int
string中字符的数目
通过填充字符fill(缺省时为
lpad(string text, length
int [, fill text])
空白),把string填充为长度
text
length。
如果string已经
lpad('hi', 5, 'xy')
比length长则将其截断(在
右边)。
ltrim(string
text [,
characters text])
md5(string
text)
repeat(string text,
number
int)
replace(string text, from
text,
to text)
从字串string的开头删除只
text
包
含characters(缺省是一
ltrim('zzzytrim','xyz')
个空白)的最长的字串。
计算给出string的MD5散
text
md5('abc')
列,以十六进制返回结果。
text
重复string
number次。
repeat('Pg', 4)
把字串string里出现地所有
length('jose')
text_in_utf8
Hi Thomas
4
xyxhi
trim
PgPgPgPg
text
子字串from替换成子字串
replace('abcdefabcdef', 'cd',
'XX')
abXXefabXXef
to。
通过填
充字符fill(缺省时为
空白),把string填充为长度
text
rpad('hi', 5, 'xy')
length。如果string已经比
length长则将其截断。
rpad(string text, length
int [, fill
text])
hixyx
rtrim(string text [,
character text])
split_part(string
text,
delimiter text, field int)
从字串string的结尾删除只
text
包含character(缺省是个空
rtrim('trimxxxx','x')
白)的最长的字
根据delimiter分隔string
text
返回生成的第field个子字串
(1 Base)。
split_part('abc~@~def~@~ghi',
'~@~',
2)
strpos('high','ig')
substr('alphabet', 3, 2)
to_ascii('Karel')
def
2
ph
Karel
trim
strpos(string, substring)
text
声明的子字串的位置。
substr(string, from [,
count])
to_ascii(text [,
encoding])
to_hex(number
intbigint)
translate(string text,
from text, to text)
text
抽取子字串。
把text从其它编码转换为
text
ASCII。
把number转换成其对应地
text
to_hex(9223372)
7fffffffffffffff
十六进制表现形式。
把在string中包含的任何匹
text
配from中的字符的字符转
translate('12345', '14',
'ax')
化为对应的在to中的字符。
a23x5
五、位串函数和操作符:
对于类型bit和bit varying,除了常用的比较操作符之外,还可以使用以下列表中由
Po
stgreSQL提供的位串函数和操作符,其中&、|和#的位串操作数必须等长。在移位的时
候,保
留原始的位串的的长度。
操作符
||
&
|
#
~
<<
>>
描述
连接
按位AND
按位OR
按位XOR
按位NOT
按位左移
按位右移
例子
B'10001'
|| B'011'
B'10001' & B'01101'
B'10001' | B'01101'
B'10001' #
B'01101'
~ B'10001'
B'10001' <<
3
B'10001' >> 2
结果
10001011
00001
11101
11100
01110
01000
00100
除了以上列表中提及的操作符之外,位串还可以使用字符串函数:length, bit_length,
octet_length, position,
substring。此外,我们还可以在整数和bit之间来回转换,
如:
MyTest=# SELECT 44::bit(10);
bit
------------
(1 row)
MyTest=# SELECT 44::bit(3);
bit
-----
100
(1 row)
MyTest=# SELECT cast(-44 as bit(12));
bit
--------------
0
(1
row)
MyTest=# SELECT
'1110'::bit(4)::integer;
int4
------
14
(1 row)
注意:如果只是转换为,意思是转换成bit(1),因此只会转换成整数的最低位。
六、模式匹配:
PostgreSQL中提供了三种实现模式匹配的方法:SQL
LIKE操作符,更近一些的
SIMILAR TO操作符,和POSIX-风格正则表达式。
1. LIKE:
string LIKE pattern [
ESCAPE escape-character ]
string NOT LIKE
pattern [ ESCAPE escape-character ]
每个patt
ern定义一个字串的集合。如果该string包含在pattern代表的字串集合里,
那么LIK
E表达式返回真。和我们想象的一样,如果 LIKE返回真,那么NOT LIKE表达
式返回假,反
之亦然。在pattern里的下划线(_)代表匹配任何单个字符,而一个百分号(%)
匹配任何零或
更多字符,如:
'abc' LIKE 'abc' true
'abc' LIKE 'a%' true
'abc' LIKE '_b_'
true
'abc' LIKE 'c' false
要匹配文本的下划线或者百分号,而不是匹配其它字符,在pattern里相应的字符必须
前导转义字
符。缺省的转义字符是反斜杠,但是你可以用ESCAPE子句指定一个。要匹配
转义字符本身,写两个
转义字符。我们也可以通过写成ESCAPE
''的方式有效地关闭转义
机制,此时,我们就不能关闭下划线和百分号的特殊含义了。
关键字ILIKE可以用于替换LIKE,令该匹配就当前的区域设置是大小写无关的。这个
特性不是S
QL标准,是PostgreSQL的扩展。操作符~~等效于LIKE,
而~~*对应
ILIKE。还有!~~和!~~*操作符分别代表NOT LIKE和NOT
ILIKE。所有这些操作
符都是PostgreSQL特有的。
2.
SIMILAR TO正则表达式:
SIMILAR
TO根据模式是否匹配给定的字符串而返回真或者假。
string SIMILAR TO
pattern [ESCAPE escape-character]
string
NOT SIMILAR TO pattern [ESCAPE escape-character]
它和LIKE非常类似,支持LIKE的通配符('_'和'%')且保持其原意。除此之外,
SIMILAR TO还支持一些自己独有的元字符,如:
1). |
标识选择(两个候选之一)。
2). * 表示重复前面的项零次或更多次。
3). + 表示重复前面的项一次或更多次。
4).
可以使用圆括弧()把项组合成一个逻辑项。
5).
一个方括弧表达式[...]声明一个字符表,就像POSIX正则表达式一样。
见如下示例:
'abc' SIMILAR TO 'abc'
true
'abc' SIMILAR TO 'a'
false
'abc' SIMILAR TO '%(b|d)%' true
'abc' SIMILAR TO '(b|c)%' false
带三个参数的substring,substring(string from pattern for
escape-character),
提供了一个从字串中抽取一个匹配SQL正则表达式模式的子字
串的函数。和SIMILAR TO
一样,声明的模式必须匹配整个数据串,否则函数失
效并返回NULL。为了标识在成功的时
候应该返回的模式部分,模式必须出现后跟双引号(的两个转
义字符。匹配这两个标记之
间的模式的字串将被返回,如:
MyTest=#
SELECT substring('foobar' from
'%#--
这里
#
是转义符,双引号内的模式是返回部分。
substring
-----------
oob
(1 row)
MyTest=# SELECT substring('foobar'
from '#
--foobar
不能完全匹配后面的模式,因此返回
NULL
。
substring
-----------
(1 row)
七、数据类型格式化函数:
PostgreSQL格式化函数提
供一套有效的工具用于把各种数据类型(日期时间、
integer、floating point和
numeric)转换成格式化的字符串以及反过来从格式化的字符
串转换成指定的数据类型。下面列出
了这些函数,它们都遵循一个公共的调用习
惯:第一
个参数是待格式化的值,而第二个是定义输出或输出格式的模板。
函数
返回类型
描述
例子
把时间戳转换成字
to_char(current_timestamp,
串
'HH12:MI:SS')
把时间间隔转为字
to_char(interval '15h 2m 12s',
串
'HH24:MI:SS')
把整数转换成字串
to_char(125, '999')
把实数双精度数
to_char(125.8::real, '999D9')
转换成字串
把numeric转换
to_char(-125.8,
'999D99S')
成字串
把字串转换成日期
to_date('05 Dec 2000', 'DD Mon
YYYY')
to_char(timestamp, text)
text
to_char(interval, text)
to_char(int,
text)
text
text
to_char(double precision,
text
text)
to_char(numeric, text)
to_date(text, text)
text
date
把字串转换成时间
to_timestamp('05 Dec
2000', 'DD
to_timestamp(text, text)
timestamp
戳
Mon YYYY')
to_timestamp(double)
to_number(text,
text)
把UNIX纪元转换
timestamp
to_timestamp(200120400)
成时间戳
numeric
把字串转换成
numeric
to_number('12,454.8-',
'99G999D9S')
1. 用于日期时间格式化的模式:
模式
描述
HH
HH12
HH24
MI
SS
MS
US
AM
YYYY
YYY
YY
Y
一天的小时数(01-12)
一天的小时数(01-12)
一天的小时数(00-23)
分钟(00-59)
秒(00-59)
毫秒(000-999)
微秒(000000-999999)
正午标识(大写)
年(4和更多位)
年的后三位
年的后两位
年的最后一位
Y,YYY
带逗号的年(4和更多位)
MONTH
全长大写月份名(空白填充为9字符)
Month
全长混合大小写月份名(空白填充为9字符)
month
全长小写月份名(空白填充为9字符)
MON
Mon
mon
MM
DAY
Day
day
DY
Dy
dy
DDD
DD
D
W
WW
模式
9
0
.(句点)
,(逗号)
PR
S
L
大写缩写月份名(3字符)
缩写混合大小写月份名(3字符)
小写缩写月份名(3字符)
月份号(01-12)
全长大写日期名(空白填充为9字符)
全长混合大小写日期名(空白填充为9字符)
全长小写日期名(空白填充为9字符)
缩写大写日期名(3字符)
缩写混合大小写日期名(3字符)
缩写小写日期名(3字符)
一年里的日子(001-366)
一个月里的日子(01-31)
一周里的日子(1-7;周日是1)
一个月里的周数(1-5)(第一周从该月第一天开始)
一年里的周数(1-53)(第一周从该年的第一天开始)
描述
带有指定数值位数的值
带前导零的值
小数点
分组(千)分隔符
尖括号内负值
带符号的数值
货币符号
2. 用于数值格式化的模板模式:
D
G
MI
PL
SG
小数点
分组分隔符
在指明的位置的负号(如果数字 < 0)
在指明的位置的正号(如果数字 >
0)
在指明的位置的正负号
八、时间日期函数和操作符:
1. 下面是PostgreSQL中支持的时间日期操作符的列表:
操作
符
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
*
函数
age(timestamp,
timestamp)
age(timestamp)
例子
date
'2001-09-28' + integer '7'
date
'2001-09-28' + interval '1 hour'
date
'2001-09-28' + time '03:00'
interval '1
day' + interval '1 hour'
timestamp
'2001-09-28 01:00' + interval '23 hours'
time '01:00' + interval '3 hours'
-
interval '23 hours'
date '2001-10-01' -
date '2001-09-28'
date '2001-10-01' -
integer '7'
date '2001-09-28' - interval
'1 hour'
time '05:00' - time '03:00'
time '05:00' - interval '2 hours'
timestamp '2001-09-28 23:00' - interval '23
hours'
interval '1 day' - interval '1
hour'
timestamp '2001-09-29 03:00' -
timestamp '2001-09-27
12:00'
interval
'1 hour' * double precision '3.5'
interval
'1 hour' double precision '1.5'
结果
date '2001-10-05'
timestamp
'2001-09-28
01:00'
timestamp
'2001-09-28
03:00'
interval '1 day
01:00'
timestamp '2001-09-29
00:00'
time '04:00'
interval
'-23:00'
integer '3'
date
'2001-09-24'
timestamp '2001-09-27
23:00'
interval '02:00'
time
'03:00'
timestamp '2001-09-28
00:00'
interval '23:00'
interval '1 day 15:00'
interval
'03:30'
interval '00:40'
例子
age('2001-04-10',
timestamp
'1957-06-13')
'1957-06-13')
结果
43 years 9
mons 27 days
43 years 8
mons 3 days
2.
日期时间函数:
返回类型
interval
描述
减去参数,生成一个使用
年、月的符号化的结果
interval
从current_date减去得到
age(timestamp
的数值
current_date
current_time
date
time
今天的日期
现在的时间
日期和时间
current_timestamp
timestamp
date_part(text,
timestamp)
date_part(text,
interval)
date_trunc(text,
timestamp)
extract(field from
timestamp)
extract(field from
interval)
localtime
localtimestamp
now()
timeofday()
域
double
date_part('hour',
获取子域(等效于extract)
timestamp '2001-02-16
20
20:38:40')
date_part('month',
double
获取子域(等效于extract)
interval '2 years 3
months')
date_trunc('hour',
3
截断成指定的精度
timestamp
timestamp '2001-02-16
20:38:40')
extract(hour from
2001-02-16
20:00:00+00
double
获取子域
timestamp '2001-02-16 20
20:38:40')
extract(month from
double
time
获取子域
今日的时间
interval '2 years 3
months')
3
日期和时间
timestamp
结果
20
当前的日期和时间(等效于
timestamp
current_timestamp)
3.
EXTRACT,date_part函数支持的field:
描述
例子
EXTRACT(CENTURY FROM
世纪
TIMESTAMP '2000-12-16
12:21:13');
text
当前日期和时间
CENTURY
DAY
DECADE
DOW
DOY
HOUR
(月分)里的日期域(1-31)
年份域除以10
EXTRACT(DAY from TIMESTAMP
'2001-02-16 20:38:40');
16
EXTRACT(DECADE from TIMESTAMP
200
'2001-02-16 20:38:40');
'2001-02-16
20:38:40');
'2001-02-16 20:38:40');
EXTRACT(HOUR from TIMESTAMP
'2001-02-16
20:38:40');
EXTRACT(MICROSECONDS from
TIME '17:12:28.5');
EXTRACT(MILLENNIUM
from
TIMESTAMP '2001-02-16
5
47
20
28500000
3
每周的星期号(0-6;星期天是0) (仅
EXTRACT(DOW FROM
TIMESTAMP
用于timestamp)
timestamp)
小时域(0-23)
一年的第几天(1 -365366) (仅用于
EXTRACT(DOY from TIMESTAMP
秒域,包括小数部分,乘以
MICROSECONDS
1,000,000。
MILLENNIUM
千年
20:38:40');
MILLISECONDS
秒域,包括小数部分,乘以 1000。
MINUTE
分钟域(0-59)
对于timestamp数值,它是一年里的
MONTH
EXTRACT(MILLISECONDS from
TIME
'17:12:28.5');
28500
EXTRACT(MINUTE from TIMESTAMP
38
'2001-02-16 20:38:40');
EXTRACT(MONTH
from TIMESTAMP
月份数(1-12);对于interval数值,
2
'2001-02-16 20:38:40');
它是月的数目,然后对12取模(0-11)
该天所在的该年的季度(1-4)(仅用于
timestamp)
EXTRACT(QUARTER from
TIMESTAMP '2001-02-16
20:38:40');
EXTRACT(SECOND from
TIMESTAMP '2001-02-16
20:38:40');
EXTRACT(WEEK from TIMESTAMP
'2001-02-16
20:38:40');
EXTRACT(YEAR from TIMESTAMP
'2001-02-16 20:38:40');
40
1
QUARTER
SECOND
秒域,包括小数部分(0-59[1])
WEEK
YEAR
该天在所在的年份里是第几周。
年份域
7
2001
4. 当前日期时间:
我们可以使用下面的函数获取当前的日期和或时间∶
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME (precision)
CURRENT_TIMESTAMP (precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME
(precision)
LOCALTIMESTAMP (precision)
九、序列操作函数:
序列对象(也叫序列生成器)都是用CREATE SEQUENCE创建的特殊的单行表。一个序
列对
象通常用于为行或者表生成唯一的标识符。下面序列函数,为我们从序列对象中获取最
新的序列值提供了
简单和并发读取安全的方法。
函数
nextval(regclass)
返回类
型
bigint
描述
递增序
列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使
多个会话并发运行nextval
,每个进程也会安全地收到一个唯一的序列值。
在当前会话中返回最近一次
next
val
抓到的该序列的数值。(如果在本会话中
currval(regclass)
bigint
从未在该序列上调用过
nextval
,那么会报
告一个错误。)请注意因为此函数
返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以
用于判
断其它会话是否执行过
nextval。
返回当前会话里最近
一次
nextval
返回的数值。这个函数等效于
currval
,
lastval()
bigint
只是它不用序列名为参数,它抓取当前
会话里面最近一次
nextval
使用的序
列。如果当前会话还没有调用过
n
extval
,那么调用
lastval
setval(regclass,
bigint)
setval(regclass,
bigint,
boolean)
将
会报错。
重置序列对象的计数器数值。设置
序列的
last_value
字段为指定数值并且将
bigint
其
is_called
字段设置为
true
,表示下一次
nextv
al
将在返回数值之前递
增该序列。
重置序列对象的计数器数值。功能等同
于上面的setval函数,只是
is_called
bigint
可以设
置为
true
或
false
。如果将其设置为
false
,
那么下一次
nextval
将返回该数值,随后的
nextval
才开始递增
该序列。
对于regclass参数,仅需用单引号括住序列名即可,因此它看上去
就像文本常量。为
了达到和处理普通SQL对象一样的兼容性,这个字串将被转换成小写,除非该序列名
是用
双引号括起,如:
nextval('foo')
--
操作序列号
foo
nextval('FOO')
--
操作序列号
foo
nextval('--
操作序列号
Foo
SELECT
setval('foo', 42);
--
下次
nextval
将返回
43
SELECT
setval('foo', 42, true);
SELECT
setval('foo', 42, false);
--
下次
nextval
将返回
42
十、条件表达式:
1. CASE:
SQL CASE表达式是一种通用的条件表达式,类似于其它语言中的ifelse语句。
CASE WHEN condition THEN result
[WHEN
...]
[ELSE result]
END
condition是一个返回boolean的表达式。如果为真,那么CASE表达式的结果就是符
合条件的result。如果结果为假,那么以相同方式 搜寻随后的WHEN子句。如果没有
WHEN
condition为真,那么case表达式的结果就是在ELSE子句里的值。如果省略了
ELSE
子句而且没有匹配的条件,结果为NULL,如:
MyTest=> SELECT *
FROM testtable;
i
---
1
2
3
(3 rows)
MyTest=> SELECT i, CASE WHEN i=1 THEN 'one'
MyTest-> WHEN i=2 THEN
'two'
MyTest->
ELSE 'other'
MyTest->
END
MyTest-> FROM testtable;
i |
case
---+-------
1 | one
2 | two
3 | other
(3 rows)
注:CASE表达式并不计算任何对于判断结果并不需要的子表达式。
2. COALESCE:
COALESCE返回它的第一个非NULL的
参数的值。它常用于在为显示目的检索数据时
用缺省值替换NULL值。
COALESCE(value[, ...])
和CASE表达式一样,COALESCE
将不会计算不需要用来判断结果的参数。也就是说,
在第一个非空参数右边的参数不会被计算。
3. NULLIF:
当且仅当value1和value2相等时,NULLIF才返回NULL。否则它返回value1。
NULLIF(value1, value2)
MyTest=>
SELECT NULLIF('abc','abc');
nullif
--------
(1 row)
MyTest=> SELECT NULLIF('abcd','abc');
nullif
--------
abcd
(1
row)
4. GREATEST和LEAST:
GREATEST和LEAST函数从一个任意的数字表达式列表里选取最大或者最小的数值。
列表中的
NULL数值将被忽略。只有所有表达式的结果都是NULL的时候,结果才会是
NULL。
GREATEST(value [, ...])
LEAST(value [,
...])
MyTest=> SELECT GREATEST(1,3,5);
greatest
----------
5
(1 row)
MyTest=> SELECT
LEAST(1,3,5,NULL);
least
-------
1
(1 row)
十一、数组函数和操作符:
1.
PostgreSQL中提供的用于数组的操作符列表:
操作符
描述
=
<>
<
>
<=
>=
||
||
||
||
等于
不等于
小于
大于
小于或等于
大于或等于
例子
ARRAY[1.1,2.1,3.1]::int[] = ARRAY[1,2,3]
ARRAY[1,2,3] <> ARRAY[1,2,4]
ARRAY[1,2,3] < ARRAY[1,2,4]
ARRAY[1,4,3] > ARRAY[1,2,4]
ARRAY[1,2,3] <= ARRAY[1,2,3]
ARRAY[1,4,3] >= ARRAY[1,4,3]
结果
t
t
t
t
t
t
{1,2,3,4,5,6}
{{1,2,3},{4,5,6},{7,8,9}}
{3,4,5,6}
{4,5,6,7}
数组与数组连接
ARRAY[1,2,3] ||
ARRAY[4,5,6]
数组与数组连接
ARRAY[1,2,3]
|| ARRAY[[4,5,6],[7,8,9]]
元素与数组连接
3 || ARRAY[4,5,6]
元素与数组连接
ARRAY[4,5,6] || 7
2.
PostgreSQL中提供的用于数组的函数列表:
函数
返回类型
描述
例子
结果
连接两个数组
array_cat(ARRAY[1,2,3],
ARRAY[4,5])
{1,2,3,4,5}
array_cat(anyarray, anyarray)
anyarray
array_append(anyarray,
anyelement)
array_prepend(anyelement,
anyarray)
向一个数组末
尾附加一个元
array_append(ARRAY[1,2],
3)
anyarray
素
向一个数组开
头附加一个元
array_prepend(1,
ARRAY[2,3])
anyarray
素
返回一个数组
array_dims(anyarray)
text
维数的文本表
array_dims(ARRAY[[1,2,3],
[4,5,6]])
[1:2][1:3]
示
array_lower(anyarray, int)
array_upper(anyarray, int)
int
int
返回指定的数
array_lower(array_prepend(0,
组维数的下界
ARRAY[1,2,3]), 1)
返回指定数组
维数的上界
使用提供的分
array_to_string(anyarray, text)
text
隔符连接数组
array_to_string(ARRAY[1, 2, 3],
'~^~')
1~^~2~^~3
元素
使用指定的分
string_to_array(text, text)
text[]
隔符把字串拆
分成数组元素
string_to_array('xx~^~yy~^~zz',
'~^~')
{xx,yy,zz}
array_upper(ARRAY[1,2,3,4],
1)
0
4
{1,2,3}
{1,2,3}
十二、系统信息函数:
1. PostgreSQL中提供的和数据库相关的函数列表:
名字
current_database()
current_schema()
current_schemas(boolean)
current_user
inet_client_addr()
inet_client_port()
inet_server_addr()
inet_server_port()
session_user
pg_postmaster_start_time()
user
version()
描
返回类型
name
name
name[]
name
inet
int
inet
int
name
timestamp
name
text
描述
当前数据库的名字
当前模式的名字
在搜索路径中的模式名字
目前执行环境下的用户名
连接的远端地址
连接的远端端口
连接的本地地址
连接的本地端口
会话用户名
postmaster启动的时间
current_user
PostgreSQL版本信息
2. 允许用户在程序里查询对象访问权限的函数:
名字
可用权限
述
用
户
是
否
有has_table_privilege(user,table,privilege)
访
SELECT
INSERTUPDATE
DELETERUL
EREFERENCES
TRIGGER
问
表
的
权
限
当
前
用
户
是
has_table_privilege(table,privilege)
否
SELECT
INSERTUPDATE
DELETER
ULEREFERENCES
TRIGGER
有
访
问
表
的
权
限
用
户
是
否
有
访
has_database_privil
ege(user,database,privilege)
has_database_privilege(database,privilege)
has_function_privilege(user,function,privilege
)
has_function_privilege(function,privilege)
问
CREATE
TEMPORARY
数
据
库
的
权
限
当
前
用
户
是
否
有
访
CREATE
TEMPORA
RY
问
数
据
库
的
权
限
用
户
是
否
有
访
问
EXECUTE
函
数
的
权
限
当
前
EXECUTE
has_language_priv
ilege(user,language,privilege)
has_language_pri
vilege(language,privilege)
has_schema_priv
ilege(user,schema,privilege)
用
户
是否
有
访
问
函
数
的
权
限
用
户
是
否
有
访
问
USAGE
语
言
的
权
限
当
前
用
户
是
否
有
访
USAGE
问
语
言
的
权
限
用
户
是
否
CREATUSAGE
有
访
问
模
式
的
权
限
当
前
用
户
是
否
has_schema_privileg
e(schema,privilege)
有
访
问
模
式
的
权
限
用
户
是
否
有
访
问
CREATE
has_tablespace_privilege(user,tablespace,privilege
)
表
空
间
的
权
限
当
前
用
户
是
has_tablespace_privilege(table
space,privilege)
否
CREATE
有
访
问
表
空
CREATUSAGE
间
的
权
限
注:以上函数
均返回
boolean
类型。要评估一个用户是否在权限上持有赋权选项,给权
限键字
附加
WITH GRANT OPTION
;比如
'UPDATE WITH
GRANT OPTION'
。
3. 模式可视性查询函数:
那些判断一个对象是否在当前模式搜索路径中可见的函数。 如果一个表所在的模式在
搜索路径中,并且没有同名的表出现在搜索路径的更早的地方,那么就说这个表视可见的。
它等效于表可以不带明确模式修饰进行引用。
名字
pg_table_is_visible(table_oid)
pg_type_is_visible(type_oid)
pg_function_is_visible(function_oid)
pg_operator_is_visible(operator_oid)
pg_opclass_is_visible(opclass_oid)
pg_conversion_is_visible(conversion_oid)
描述
该表视图是否在搜索路径中可见
该类视图型是否在搜索路径中可见
该函数是否在搜索路径中可见
该操作符是否在搜索路径中可见
该操作符表是否在搜索路径中可见
转换是否在搜索路径中可见
应用类型
regclass
regtype
regprocedure
regoperator
regclass
regoperator
注:以上函数均返回
boolean
类型,所有这些函数都需要对象
OID
标识作为检查的对
象。
postgres=# SELECT
pg_table_is_visible('testtable'::regclass);
pg_table_is_visible
---------------------
t
(1 row)
4.
系统表信息函数:
名字
format_type(type_oid,typemod)
pg_get_viewdef(view_oid)
pg_get_viewdef(view_oid,pretty_bool)
pg_get_ruledef(rule_oid)
pg_get_ruledef(rule_oid,pretty_bool)
pg_get_indexdef(index_oid)
返回类
型
text
text
text
text
text
text
描述
获取一个数据类型的SQL名称
为视图获取CREATE VIEW命令
为视图获取CREATE
VIEW命令
为规则获取CREATE RULE命令
为规则获取CREATE RULE命令
为索引获取CREATE
INDEX命令
为索引获取CREATE INDEX命令, 如果
pg_get_
indexdef(index_oid,column_no,pretty_bool)
text
column_no不为零,则是只获取一个索引
字段的定义
pg_get_triggerdef(trigger_oid)
pg_get_constraintdef(constraint_oid)
p
g_get_constraintdef(constraint_oid,pretty_bool)
text
text
text
为触发器获取CREATE [CONSTRAINT]
TRIGGER
获取一个约束的定义
获取一个约束的定义
反编译
一个表达式的内部形式,假设其中
pg_get_expr(expr_text,relation_
oid)
text
的任何Vars都引用第二个参数指出的关
系
反编译一个表达式的内部形式
,假设其中
pg_get_expr(expr_text,relation_oid,
pretty_bool)
pg_get_userbyid(roleid)
text
的任何Vars都引用第二个参数指出的关
系
name
获取给出的ID的角色名
获取一个serial或者bigserial字段使用的
序列名字
的一套数据库的OID的集合
pg_get_serial_sequence(t
able_name,column_name)
text
pg_tablespace_databases(tablespace_oid)
setof
获取在指定表空间(OID表示)中拥有对象
oid
这些函数大多数都有两个变种,其中一个可以选择对结果的漂亮的打印。 漂亮打印的
格式更容易读,但
是缺省的格式更有可能被将来的PostgreSQL版本用同样的方法解释;
如果是用于转储,那么尽
可能避免使用漂亮打印。
给漂亮打印参数传递false生成的结果
和那个没有这个参数的变种生成的结果完全一样。
十三、系统管理函数:
1.
查询以及修改运行时配置参数的函数:
名字
current_setting(setting_name)
返回类型
描述
text
当前设置的值
设置参数并返回新值
set_config(setting_name,new_
value,is_local)
text
current_s
etting用于以查询形式获取setting_name设置的当前数值。它和SQL命
令SHOW
是等效的。 比如:
MyTest=# SELECT
current_setting('datestyle');
current_setting
-----------------
ISO, YMD
(1 row)
set_config将参数sett
ing_name设置为new_value。如果is_local设置为true,
那么新数值将只
应用于当前事务。如果你希望新的数值应用于当前会话,那么应该使用
false。它等效于SQL命令
SET。比如:
MyTest=# SELECT
set_config('log_statement_stats','off', false);
set_config
------------
off
(1 row)
2.
数据库对象尺寸函数:
名字
pg_tablespace_size(oid)
返回类
型
描述
bigint
指定OID代表的表空间使用的磁盘空间
pg_tablespace_size(name)
bigint
指定名字的表空间使用的磁盘空间
pg_database_size(oid)
pg_database_size(name)
pg_relation_size(oid)
pg_relation_size(text)
bigint
指定OID代表的数据库使用的磁盘空间
bigint
指定名称的数据库使用的磁盘空间
bigint
bigint
指定OID代表的表或者索引所使用的磁盘空
间
指定名称的表或者索引使用的磁盘空间。这
个名字可以用模式名修饰
指定OID代表的表使用的磁盘空间,包括索
引和压缩数据
指定名字的表所
使用的全部磁盘空间,包括
索引和压缩数据。表名字可以用模式名修饰。
把字节计算的尺寸转换成一个人类易读的尺
寸单位
返回
类型
pg_total_relation_size(oid)
bigint
pg_total_relation_size(text)
bigint
pg_size_pretty(bigint)
text
3. 数据库对象位置函数:
名字
描述
获取指定对象的文件节点编
号(通常为对象的oid值)。
获取指定对象的完整路径名。
pg_relation_filenode(relationregclass) oid
text
pg_relation_filepath(relationregclass)