八、时间/日期函数和操作符:
    1. 下面是PostgreSQL中支持的时间/日期操作符的列表:

操作符例子结果
+date '2001-09-28' + integer '7'date '2001-10-05'
+date '2001-09-28' + interval '1 hour'timestamp '2001-09-28 01:00'
+date '2001-09-28' + time '03:00'timestamp '2001-09-28 03:00'
+interval '1 day' + interval '1 hour'interval '1 day 01:00'
+timestamp '2001-09-28 01:00' + interval '23 hours'timestamp '2001-09-29 00:00'
+time '01:00' + interval '3 hours'time '04:00'
-- interval '23 hours'interval '-23:00'
-date '2001-10-01' - date '2001-09-28'integer '3'
-date '2001-10-01' - integer '7'date '2001-09-24'
-date '2001-09-28' - interval '1 hour'timestamp '2001-09-27 23:00'
-time '05:00' - time '03:00'interval '02:00'
-time '05:00' - interval '2 hours'time '03:00'
-timestamp '2001-09-28 23:00' - interval '23 hours'timestamp '2001-09-28 00:00'
-interval '1 day' - interval '1 hour'interval '23:00'
-timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00'interval '1 day 15:00'
*interval '1 hour' * double precision '3.5'interval '03:30'
/interval '1 hour' / double precision '1.5'interval '00:40'

    2. 日期/时间函数:

函数返回类型描述例子结果
age(timestamp, timestamp)interval减去参数,生成一个使用年、月的"符号化"的结果age('2001-04-10', timestamp '1957-06-13')43 years 9 mons 27 days
age(timestamp)interval从current_date减去得到的数值age(timestamp '1957-06-13')43 years 8 mons 3 days
current_datedate今天的日期
current_timetime现在的时间
current_timestamptimestamp日期和时间
date_part(text, timestamp)double获取子域(等效于extract)date_part('hour', timestamp '2001-02-16 20:38:40')20
date_part(text, interval)double获取子域(等效于extract)date_part('month', interval '2 years 3 months')3
date_trunc(text, timestamp)timestamp截断成指定的精度date_trunc('hour', timestamp '2001-02-16 20:38:40')2001-02-16 20:00:00+00
extract(field from timestamp)double获取子域extract(hour from timestamp '2001-02-16 20:38:40')20
extract(field from interval)double获取子域extract(month from interval '2 years 3 months')3
localtimetime今日的时间
localtimestamptimestamp日期和时间
now()timestamp当前的日期和时间(等效于 current_timestamp)
timeofday()text当前日期和时间

    3. EXTRACT,date_part函数支持的field:

描述例子结果
CENTURY世纪EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');20
DAY(月分)里的日期域(1-31)EXTRACT(DAY from TIMESTAMP '2001-02-16 20:38:40');16
DECADE年份域除以10EXTRACT(DECADE from TIMESTAMP '2001-02-16 20:38:40');200
DOW每周的星期号(0-6;星期天是0) (仅用于timestamp)EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');5
DOY一年的第几天(1 -365/366) (仅用于 timestamp)EXTRACT(DOY from TIMESTAMP '2001-02-16 20:38:40');47
HOUR小时域(0-23)EXTRACT(HOUR from TIMESTAMP '2001-02-16 20:38:40');20
MICROSECONDS秒域,包括小数部分,乘以 1,000,000。EXTRACT(MICROSECONDS from TIME '17:12:28.5');28500000
MILLENNIUM千年EXTRACT(MILLENNIUM from TIMESTAMP '2001-02-16 20:38:40');3
MILLISECONDS秒域,包括小数部分,乘以 1000。EXTRACT(MILLISECONDS from TIME '17:12:28.5');28500
MINUTE分钟域(0-59)EXTRACT(MINUTE from TIMESTAMP '2001-02-16 20:38:40');38
MONTH对于timestamp数值,它是一年里的月份数(1-12);对于interval数值,它是月的数目,然后对12取模(0-11)EXTRACT(MONTH from TIMESTAMP '2001-02-16 20:38:40');2
QUARTER该天所在的该年的季度(1-4)(仅用于 timestamp)EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40');1
SECOND秒域,包括小数部分(0-59[1])EXTRACT(SECOND from TIMESTAMP '2001-02-16 20:38:40');40
WEEK该天在所在的年份里是第几周。EXTRACT(WEEK from TIMESTAMP '2001-02-16 20:38:40');7
YEAR年份域EXTRACT(YEAR from TIMESTAMP '2001-02-16 20:38:40');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,每个进程也会安全地收到一个唯一的序列值。
currval(regclass)bigint在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。
lastval()bigint返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 
setval(regclass, bigint)bigint重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。
setval(regclass, bigint, boolean)bigint重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为truefalse。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。

    对于regclass参数,仅需用单引号括住序列名即可,因此它看上去就像文本常量。为了达到和处理普通SQL对象一样的兼容性,这个字串将被转换成小写,除非该序列名是用双引号括起,如:
    nextval('foo')     --操作序列号foo
    nextval('FOO')    --操作序列号foo
    nextval('"Foo"')   --操作序列号Foo
    SELECT setval('foo', 42);    --下次nextval将返回43
    SELECT setval('foo', 42, true);    
    SELECT setval('foo', 42, false);   --下次nextval将返回42

    
十、条件表达式:
    1. CASE:
    SQL CASE表达式是一种通用的条件表达式,类似于其它语言中的if/else语句。
    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]t
<>不等于ARRAY[1,2,3] <> ARRAY[1,2,4]t
<小于ARRAY[1,2,3] < ARRAY[1,2,4]t
>大于ARRAY[1,4,3] > ARRAY[1,2,4]t
<=小于或等于ARRAY[1,2,3] <= ARRAY[1,2,3]t
>=大于或等于ARRAY[1,4,3] >= ARRAY[1,4,3]t
||数组与数组连接ARRAY[1,2,3] || ARRAY[4,5,6]{1,2,3,4,5,6}
||数组与数组连接ARRAY[1,2,3] || ARRAY[[4,5,6],[7,8,9]]{{1,2,3},{4,5,6},{7,8,9}}
||元素与数组连接3 || ARRAY[4,5,6]{3,4,5,6}
||元素与数组连接ARRAY[4,5,6] || 7{4,5,6,7}

    2. PostgreSQL中提供的用于数组的函数列表:

函数返回类型描述例子结果
array_cat(anyarray, anyarray)anyarray连接两个数组array_cat(ARRAY[1,2,3], ARRAY[4,5]){1,2,3,4,5}
array_append(anyarray, anyelement)anyarray向一个数组末尾附加一个元素array_append(ARRAY[1,2], 3){1,2,3}
array_prepend(anyelement, anyarray)anyarray向一个数组开头附加一个元素array_prepend(1, ARRAY[2,3]){1,2,3}
array_dims(anyarray)text返回一个数组维数的文本表示array_dims(ARRAY[[1,2,3], [4,5,6]])[1:2][1:3]
array_lower(anyarray, int)int返回指定的数组维数的下界array_lower(array_prepend(0, ARRAY[1,2,3]), 1)0
array_upper(anyarray, int)int返回指定数组维数的上界array_upper(ARRAY[1,2,3,4], 1)4
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}

 

 

One Response


    还没有评论!
1  

Leave your comment

请留下您的姓名(*)

请输入正确的邮箱地址(*)

请输入你的评论(*)


感谢开源 © 2016. All rights reserved.&3Q Open Source&^_^赣ICP备15012863号-1^_^
乐于分享共同进步 KreativeThemes