Postgres SQL常用语句

下面记录一些常用的Postgres SQL语句,供大家学习

一,时间操作

(1)提取时间中的精度

   
   
  1. EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13');--抽取世纪 20
  2. EXTRACT(DAY from TIMESTAMP '2001-02-16 20:38:40');--抽取天 16
  3. EXTRACT(DECADE from TIMESTAMP '2001-02-16 20:38:40');--年份域除以 10 ,200
  4. EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40');--每周的星期号(0-6;星期天是 0) (仅用于timestamp)
  5. EXTRACT(DOY from TIMESTAMP '2001-02-16 20:38:40'); --一年的第几天(1 -365/366) (仅用于 timestamp)
  6. EXTRACT(HOUR from TIMESTAMP '2001-02-16 20:38:40');--小时域(0-23)
  7. EXTRACT(MICROSECONDS from TIME '17:12:28.5');--秒域,包括小数部分,乘以 1,000,000
  8. EXTRACT(MILLENNIUM from TIMESTAMP '2001-02-16 20:38:40');--千年 3
  9. EXTRACT(MILLISECONDS from TIME'17:12:28.5');--秒域,包括小数部分,乘以 100028500
  10. EXTRACT(MINUTE from TIMESTAMP '2001-02-16 20:38:40');--分钟域(0-59)
  11. EXTRACT(MONTH from TIMESTAMP '2001-02-16 20:38:40');--对于 timestamp 数值,它是一年里的月份数(1-12);对于 interval 数值,它是月的数目,然后对 12 取模(0-11)
  12. EXTRACT(QUARTER from TIMESTAMP '2001-02-16 20:38:40');--该 (1-4)( timestamp)
  13. EXTRACT(SECOND from TIMESTAMP '2001-02-16 20:38:40');--秒域,包括小数部分(0-59[1])
  14. EXTRACT(WEEK from TIMESTAMP '2001-02-16 20:38:40');---该天在所在的年份里是第几周
  15. EXTRACT(YEAR from TIMESTAMP '2001-02-16 20:38:40');--年份域

(2)将日期截断为指定精度的日期

   
   
  1. date_trunc('hour', timestamp '2014-09-26 08:10:40');--20104-9-26 08:00:00
  2. date_trunc('day', timestamp '2014-09-26 08:10:40');--2014-09-26 00:00:00
  3. date_trunc('week', timestamp '2014-09-26 08:10:40');--2014-09-22 00:00:00 礼拜一
  4. date_trunc('month', timestamp '2014-09-26 08:10:40');--2014-09-00 00:00:00
  5. date_trunc ('year', timestamp '2014-09-26 08:10:40');--2014-00-00 00:00:00

(3)时间运算

   
   
  1. date '2001-09-28' + integer '7' =》 date '2001-10-05'
  2. date '2001-09-28' + interval '1 hour' =》 timestamp '2001-09-28 01:00'
  3. date '2001-09-28' + time '03:00' =》 timestamp '2001-09-28 03:00'
  4. interval '1 day' + interval '1 hour' =》 interval '1 day 01:00'
  5. timestamp '2001-09-28 01:00' + interval '23 hours' =》timestamp '2001-09-29 00:00'
  6. time '01:00' + interval '3 hours' =》time '04:00'
  7. - interval '23 hours' =》interval '-23:00'
  8. date '2001-10-01' - date '2001-09-28' =》integer '3'
  9. date '2001-10-01' - integer '7' =》date '2001-09-24'
  10. date '2001-09-28' - interval '1 hour'=》timestamp '2001-09-27 23:00'
  11. time '05:00' - time '03:00' =》interval '02:00'
  12. time '05:00' - interval '2 hours' =》time '03:00'
  13. timestamp '2001-09-28 23:00' - interval '23 hours' =》timestamp '2001-09-28 00:00'
  14. interval '1 day' - interval '1 hour'=》interval '23:00'
  15. timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' =》interval '1 day 15:00'
  16. interval '1 hour' * double precision '3.5' =》interval '03:30'
  17. interval '1 hour' / double precision '1.5' =》interval '00:40'

二,字符串类

(1)常用函数

   
   
  1. 根据delimiter分隔 string
  2. split_part('abc~@~def~@~ghi', '~@~',2) =>def
  3. select substring('steps:97573' from 7)
  4.  
  5. 字串连接
  6. 'Post' || 'greSQL' =》PostgreSQL
  7.  
  8. 字串里二进制位的个
  9. bit_length('jose') =》32
  10.  
  11. 字串中的字符个数
  12. char_length('jose') =》4
  13.  
  14. 把字串转化为小
  15. lower('TOM') =》tom
  16.  
  17. 把字串转化为大写
  18. upper('tom') =》TOM
  19.  
  20. 字串中的字节
  21. octet_length('jose') =>4
  22.  
  23. 替换子字串
  24. overlay('Txxxxas' placing 'hom' from 2 for 4) =>Thomas
  25.  
  26. 指定的子字串的位
  27. position('om' in 'Thomas') =>3
  28.  
  29. 抽取子字串
  30. substring('Thomas' from 2 for 3) =>hom
  31.  
  32. 抽取子字串
  33. substr('alphabet',3, 2) =>ph
  34.  
  35. 抽取匹配 POSIX 正则表达式的子字串
  36. substring('Thomas' from '...$') =>mas
  37.  
  38. 抽取匹配SQL正则表达式的子字串
  39. substring('Thomas' from '%#"o_a#"_' for '#') =>oma
  40.  
  41. 参数第一个字符的 ASCII
  42. ascii('x') =》120
  43.  
  44. 给出 ASCII 码的字
  45. chr(65) =》A
  46.  
  47. 把字串string里出现地所有子字串from 替换成子字串 to 
  48. replace('abcdefabcdef', 'cd', 'XX')   =>abXXefabXXef
  49.  
  50. 从字串 string 开头/结尾/两边/ 删除只包含 characters (缺省是一个空白)的最长的字串 
  51. trim(both 'x' from 'xTomxx')  =>Tom
  52.  
  53. string 开头和结尾删除只包含在characters里(缺省是空白)的字符的最长字串
  54. btrim('xyxtrimyyx','xy') =》trim
  55.  
  56. 把每个单词的第一个子母转为大写,其它的保留小写。 单词是一系列字母数字组成的字符,用非字母数字分隔。
  57. initcap('hi thomas') =》Hi Thomas
  58.  
  59. string 中字符的数目
  60. length('jose') =》4

(2)格式化

函数返回类型描述例子
to_char(timestamp, text)text把时间戳转换成字串to_char(current_timestamp, 'HH12:MI:SS')
to_char(interval, text)text把时间间隔转为字串 to_char(interval'15h 2m 12s','HH24:MI:SS')
to_char(int,text)   text把整数转换成字串to_char(125, '999')
to_char(doubleprecision, text)text把实数/双精度数转换成字串to_char(125.8::real,'999D9')
to_char(numeric,text)text把 numeric转换成字串 to_char(-125.8,'S999D99')
to_date(text,text)date把字串转换成日期to_date('05 Dec 2000','DD Mon YYYY')
to_timestamp(text, text)timestamp把字串转换成时间戳to_timestamp('05 Dec 2000', 'DD Mon YYYY')
to_timestamp(double precision)timestamp把 UNIX 纪元转换成时间戳to_timestamp(200120400)

 

三,其他

(1)条件表达式

   
   
  1. CASE WHEN condition THEN result
  2. [WHEN ...]
  3. [ELSE result]
  4. END

(2)COALESCE

   
   
  1. COALESCE(value[, ...]) 返回它的第一个非 NULL 的参数的值。

(3)NULLIF

   
   
  1. NULLIF(value1, value2) 当且仅当 value1 value2 相等时,NULLIF 才返回 NULL 否则它返回 value1

(4)GREATEST 和 LEAST    

   
   
  1. GREATEST LEAST 函数从一个任意的数字表达式列表里选取最大或者最小的数值。 这些表达式必须都可以转换成一个普通的数据类型,它将会是结果类型
  2. 列表中的 NULL 数值将被忽略。只有所有表达式的结果都是 NULL 的时候,结果才会是 NULL
  3. GREATEST(value [, ...])
  4. LEAST(value [, ...])

(5)集合的函数

generate_series(start, stop)
generate_series(start, stop, step)

   
   
  1. select generate_series(1,10);
  2. generate_series
  3. -----------------
  4. 1
  5. 2
  6. 3
  7. 4
  8. 5
  9. 6
  10. 7
  11. 8
  12. 9
  13. 10
  14. (10 rows)
  15.  
  16. select generate_series(1,10,3);
  17. generate_series
  18. -----------------
  19. 1
  20. 4
  21. 7
  22. 10
  23. (4 rows)
  24.  
  25. select generate_series(5,1,-1);
  26. generate_series
  27. -----------------
  28. 5
  29. 4
  30. 3
  31. 2
  32. 1
  33. (5 rows)
  34.  
  35. 2.时间类型
  36. select generate_series(now(),now() + '7 day','1 day');
  37. generate_series
  38. -------------------------------
  39. 2012-08-27 22:12:40.915368+08
  40. 2012-08-28 22:12:40.915368+08
  41. 2012-08-29 22:12:40.915368+08
  42. 2012-08-30 22:12:40.915368+08
  43. 2012-08-31 22:12:40.915368+08
  44. 2012-09-01 22:12:40.915368+08
  45. 2012-09-02 22:12:40.915368+08
  46. 2012-09-03 22:12:40.915368+08
  47. (8 rows)
  48.  
  49. select generate_series(to_date('20120827','yyyymmdd'),to_date('20120828','yyyymmdd'),'3 h');
  50. generate_series
  51. ------------------------
  52. 2012-08-27 00:00:00+08
  53. 2012-08-27 03:00:00+08
  54. 2012-08-27 06:00:00+08
  55. 2012-08-27 09:00:00+08
  56. 2012-08-27 12:00:00+08
  57. 2012-08-27 15:00:00+08
  58. 2012-08-27 18:00:00+08
  59. 2012-08-27 21:00:00+08
  60. 2012-08-28 00:00:00+08
  61. (9 rows)

(6)用WITH构造虚拟表,提高性能

   
   
  1. WITH running_tmp AS(
  2. select * from running
  3. )
  4. SELECT * FROM running_tmp;

 

友荐云推荐

 转载请注明出处: http://bianmaren.com/u/1/blog/detail/11

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值