添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

字符串替换: overlay(string placing string from int [for int])

replace(string text, from text, to text)

select overlay('Ruby_______Rails' placing ' on ' from 5 for 7)-- Ruby on Rails
select replace('Ruby_______Rails', '_______', ' on '); -- Ruby on Rails`

截取字符串: substring(string [from int] [for int])substr(string, from [, count])

select substring('Ruby on Rails' from 1 for 4); -- Ruby
select substring('Ruby on Rails', 1, 4);        -- Ruby
select substr('Ruby on Rails', 1, 4);           -- Ruby
select substr('Ruby on Rails', 6);              -- on Rails
select substring('foobar' from '%#"o_b#"%' FOR '#');
-- oob  (这里#是转义符,双引号内的模式是返回部分)

子字符串位置 position(substring in string)

select position('ruby-china','-');
-- 5 (利用这个特性可以用于判断字符串中是否包含某个子字符串)

去除首位空格:trim(string)

select trim('    ruby    ');  -- 'ruby'

去除左边空格/字符: ltrim(string text [, characters text])

select ltrim('    ruby') -- ruby
select ltrim('__ruby','_') -- ruby

去除右边空格/字符: rtrim(string text [, characters text])

select rtrim('ruby    ')    -- ruby
select rtrim('ruby__','_')  -- ruby

获取字符串的 MD5 值:md5()

select md5('ruby'); -- 58e53d1324eef6265fdb97b08ed9aadf

字符串分割: split_part(string text, delimiter text, field int)

select split_part('i||love||you', '||', 2); -- love

四 模式匹配

'abc' LIKE 'abc'    true
'abc' LIKE 'a%'     true
'abc' LIKE '_b_'    true
'abc' LIKE 'c'      false  

下划线(_)代表匹配任何单个字符,而一个百分号(%)匹配任何零或更多字符,如:

SIMILAR TO正则表达式

SIMILAR TO根据模式是否匹配给定的字符串而返回真或者假。

string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]

它和LIKE非常类似,支持LIKE的通配符(‘_’和’%’)且保持其原意。除此之外,SIMILAR TO还支持一些自己独有的元字符,如:

  • | 标识选择(两个候选之一)。

  • 表示重复前面的项零次或更多次。
  • 表示重复前面的项一次或更多次。
  • 可以使用圆括弧()把项组合成一个逻辑项。

  • 一个方括弧表达式[…]声明一个字符表,就像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。为了标识在成功的时候应该返回的模式部分,模式必须出现后跟双引号(“)的两个转 义字符。匹配这两个标记之间的模式的字串将被返回,如:

    SELECT substring('foobar' from '%#"o_b#"%' FOR '#'); -- oob
    

    用于日期/时间格式化的模式

    模式    描述
    HH     一天的小时数(01-12)
    HH12   一天的小时数(01-12)
    HH24   一天的小时数(00-23)
    MI     分钟(00-59)
    SS     秒(00-59)
    MS     毫秒(000-999)
    US     微秒(000000-999999)
    AM     正午标识(大写)
    Y,YYY  带逗号的年(4和更多位)
    YYYY   年(4和更多位)
    YYY    年的后三位
    YY     年的后两位
    Y      年的最后一位
    MONTH  全长大写月份名(空白填充为9字符)
    Month  全长混合大小写月份名(空白填充为9字符)
    month  全长小写月份名(空白填充为9字符)
    MON    大写缩写月份名(3字符)
    Mon    缩写混合大小写月份名(3字符)
    mon    小写缩写月份名(3字符)
    MM     月份号(01-12)
    DAY    全长大写日期名(空白填充为9字符)
    Day    全长混合大小写日期名(空白填充为9字符)
    day    全长小写日期名(空白填充为9字符)
    DY     缩写大写日期名(3字符)
    Dy     缩写混合大小写日期名(3字符)
    dy     缩写小写日期名(3字符)
    DDD    一年里的日子(001-366)
    DD     一个月里的日子(01-31)
    D      一周里的日子(1-7;周日是1)
    W      一个月里的周数(1-5)(第一周从该月第一天开始)
    WW     一年里的周数(1-53)(第一周从该年的第一天开始)
    

    五 日期/时间函数

    当前时间: localtime, localtimestamp, now(), current_time

    select localtime, localtimestamp, now(), current_time;
    --00:06:12.109832 | 2014-01-29 00:06:12.109832 | 2014-01-29 00:06:12.109832+08 | 00:06:12.109832+08
    

    当前日期: current_date

    select current_date; -- 2014-01-28
    

    当前日期和时间: current_timestamp

    select current_timestamp; -- 2014-01-28 23:40:14.761216+08
    

    获取子域: date_part(text, timestamp), 等同于 extract(field from timestamp)

    select date_part('year',   timestamp'2014-01-28 23:40:14.761216+08'); -- 2014
    select date_part('month',  timestamp'2014-01-28 23:40:14.761216+08'); -- 1
    select date_part('day',    timestamp'2014-01-28 23:40:14.761216+08'); -- 28
    select date_part('week',   timestamp'2014-01-28 23:40:14.761216+08'); -- 5
    select date_part('hour',   timestamp'2014-01-28 23:40:14.761216+08'); -- 23
    select date_part('minute', timestamp'2014-01-28 23:40:14.761216+08'); -- 40
    select date_part('second', timestamp'2014-01-28 23:40:14.761216+08'); -- 14.761216
    select extract(year from timestamp '2014-01-28 23:40:14.761216+08');  -- 2014
    

    截断成指定的精度: date_trunc(text, timestamp)

    select date_trunc('hour', timestamp '2014-01-28 23:40:14.761216+08');
    -- 2014-01-28 23:00:00
    

    1 BETWEEN

    a BETWEEN x AND y 等效于 a >= x AND a <= y

    a NOT BETWEEN x AND y 等效于 a < x OR a > y

    2 拼接多条记录的值

    select array_to_string( array(select nickname from users where id < 100), ';')
    

    3 string_agg 聚合函数,用于将字段拼接成字符串,相当于对string进行sum 例如: users表有如下纪录:

    select parent_area_code,
           string_agg(name,';'),
           string_agg(name || '_' || area_code , ';')
    from locations where parent_area_code is not null
    group by parent_area_code
    

    4 array_agg 列转数组

    上例也可以用 array_agg + array_to_string 间接实现:

    select id, array_to_string(array_agg(area_name), ';') as area_names
    from users group by id