PostgreSQL-PL/pgSQL-cursor,loop

将spam_keyword表word字段的字符全部拆分,只是利用过程语言完成循环的操作而已。

create or replace function proc1() returns setof text as $$
declare
str text;
strlength int;
strreturn text;
i int;
curs1 refcursor; --声明游标
begin
open curs1 for select replace(word,' ','') from spam_keyword; --在loop前打开游标并绑定好范围,query定义范围的时候就把空格都替换掉
<<loop1>> --标签
loop
    fetch curs1 into str;
    if not found then exit;
    end if;
    i:=0; --每一次游标完成赋值后就把i初始化为0
    <<loop2>>
    loop
        i:=i+1;
        strreturn:=substring(str,i,1);
        strlength:=char_length(str);
        return next strreturn;
        exit when i>=strlength;
    end loop loop2;
end loop loop1;
close curs1;
end;
$$ language plpgsql

 返回的是setof结果集,再用分组查询可以统计到各个字符的数量。

select proc1,count(*) from proc1() group by proc1 order by count desc;
 proc1 | count 
-------+-------
 医    |    65
 院    |    61
 小    |    41
 1     |    38
 州    |    36
 0     |    35
 5     |    32
...省略1000行左右
 他    |     1
 丹    |     1
 扑    |     1
 朵    |     1
 债    |     1
 }     |     1
(1145 行记录)

 


写成通用的函数,通过指定参数来分割

create or replace function split_to_table(str text) returns setof text as $$
declare
strlength int;
strreturn text;
i int;
begin
i:=0;
loop
    i:=i+1;
    str:=replace(str,' ','');
    strlength:=char_length(str);
    strreturn:=substring(str,i,1);
    return next strreturn;
    exit when i>=strlength;
end loop;
end;
$$ language plpgsql

 这样使用

select split_to_table(word) from spam_keyword;

 

后来突然想起来去看看是不是本来就有分割字符的函数在。。一查果然有。。。席巴。。。

函数:regexp_split_to_array(string text, pattern text [, flags text ])
说明:Split string using a POSIX regular expression as the delimiter. See Section 9.7.3 for more information. 利用正则表达式将字符串分割成数组
例子:regexp_split_to_array('hello world', E'\\s+') = {hello,world}

函数:regexp_split_to_table(string text, pattern text [, flags text])
说明:Split string using a POSIX regular expression as the delimiter. See Section 9.7.3 for more information. 利用正则表达式将字符串分割成表格
例子:regexp_split_to_table('hello world', E'\\s+') =
hello
world
(2 rows)

select regexp_split_to_table(word,E'') from spam_keyword;

 

转载于:https://www.cnblogs.com/right-dress/p/5007769.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值