• postgresSQL多种字符串分割及查询汇总


     

    目录

    表及数据准备

    SPLIT_PART函数应用及说明

    string_to_array函数应用及说明

    基于指定规则查询该列所有

    按需分割后产生的字符串单独判断

    按需分割后产生的字符串及其它列混合查询

    以按需分割查询为条件查询其它列

    array_length函数应用及说明


     

    表及数据准备

    测试表

    1. create table flag_info(
    2. id     int
    3. ,name varchar(20)    default ''    -- xx标志
    4. ,value             int    default 0            
    5. ,PRIMARY KEY(id)
    6. );

    插入部分数据

    1. insert into flag_info values(1,'a.b.c', 127);
    2. insert into flag_info values(2,'a.b.d', 6);
    3. insert into flag_info values(3,'a.c.d', 91);
    4. insert into flag_info values(4,'b.c.d', 97);
    5. insert into flag_info values(5,'b.c.e', 5);


    看看所有数据:

    1.  select * from flag_info;
    2.  id | name  | value 
    3. ----+-------+-------
    4.   1 | a.b.c |   127
    5.   2 | a.b.d |     6
    6.   3 | a.c.d |    91
    7.   4 | b.c.d |    97
    8.   5 | b.c.e |     5
    9. (5 rows)

     

    SPLIT_PART函数应用及说明

     

    1,查询name分割后第二位值=c的所有记录:

    1. # select * from flag_info where SPLIT_PART(name,'.',2) = 'c';
    2.  id | name  | value 
    3. ----+-------+-------
    4.   3 | a.c.d |    91
    5.   4 | b.c.d |    97
    6.   5 | b.c.e |     5
    7. (3 rows)

    2,查询name分割后第1位值=a的所有记录:

    1. #select * from flag_info where SPLIT_PART(name,'.',1) = 'a';
    2.  id | name  | value 
    3. ----+-------+-------
    4.   1 | a.b.c |   127
    5.   2 | a.b.d |     6
    6.   3 | a.c.d |    91
    7. (3 rows)

    注意:第几位不从0开始,是从1开始的。

    再来,插入一些不包含.的值:

    1. insert into flag_info values(6,'a', 1);
    2. insert into flag_info values(7,'a.b', 1);

    现在共7条数据:

    1. #select * from flag_info;
    2.  id | name  | value 
    3. ----+-------+-------
    4.   1 | a.b.c |   127
    5.   2 | a.b.d |     6
    6.   3 | a.c.d |    91
    7.   4 | b.c.d |    97
    8.   5 | b.c.e |     5
    9.   6 | a     |     1
    10.   7 | a.b   |     1
    11. (7 rows)

    继续:

    1. #select * from flag_info where SPLIT_PART(name,'.',1) = 'a';
    2.  id | name  | value 
    3. ----+-------+-------
    4.   1 | a.b.c |   127
    5.   2 | a.b.d |     6
    6.   3 | a.c.d |    91
    7.   6 | a     |     1
    8.   7 | a.b   |     1
    9. (5 rows)

    可以看到id=6的也查出来了,id=6的值不包含.   说明分割后默认a就是第1位,同样会被查询出来。

     

    string_to_array函数应用及说明

     

    基于指定规则查询该列所有

    1. select  string_to_array(name,'.') from flag_info;
    2.  {a,b,c}
    3.  {a,b,d}
    4.  {a,c,d}
    5.  {b,c,d}
    6.  {b,c,e}
    7.  {a}
    8.  {a,b}
    9. (7 rows)

    查询后返回的是一个array.

     

    按需分割后产生的字符串单独判断

    比如获取分割后每个数组的第一个元素:

    1. select ss[1] from (select string_to_array(name,'.')  ss from flag_info ) f;
    2.  ss 
    3. ----
    4.  a
    5.  a
    6.  a
    7.  b
    8.  b
    9.  a
    10.  a
    11. (7 rows)

     

    按需分割后产生的字符串及其它列混合查询

    除了name分割后的第一个元素,id也想获取怎么办?

    1. select id,ss[1] from (select id,string_to_array(name,'.')  ss from flag_info ) f;
    2.  id | ss 
    3. ----+----
    4.   1 | a
    5.   2 | a
    6.   3 | a
    7.   4 | b
    8.   5 | b
    9.   6 | a
    10.   7 | a

    以按需分割查询为条件查询其它列


    获取第一个元素为a的所有记录的id及name原值:

    1. select id,name from (select id,name,string_to_array(name,'.')  ss from flag_info) f where ss[1]='a';
    2.  id | name  
    3. ----+-------
    4.   1 | a.b.c
    5.   2 | a.b.d
    6.   3 | a.c.d
    7.   6 | a
    8.   7 | a.b
    9. (5 rows


    再比如只获取分割后第一个元素为a的id:

    1. select id from (select id,string_to_array(name,'.')  ss from flag_info) f where ss[1]='a';
    2.  id 
    3. ----
    4.   1
    5.   2
    6.   3
    7.   6
    8.   7
    9. (5 rows)


    array_length函数应用及说明

     

    计算所有记录name列分割后的数组长度,并输出id及原name:

    1. select id,name,array_length(string_to_array(name,'.'),1) len from flag_info;
    2.  id | name  | len 
    3. ----+-------+-----
    4.   1 | a.b.c |   3
    5.   2 | a.b.d |   3
    6.   3 | a.c.d |   3
    7.   4 | b.c.d |   3
    8.   5 | b.c.e |   3
    9.   6 | a     |   1
    10.   7 | a.b   |   2
    11. (7 rows)

     

    分享无涯,祝君快乐!

     

     

  • 相关阅读:
    结构型模式-外观模式
    【1】请问什么是 AQS?
    ASO优化关键词覆盖、曝光原理
    G1D15-fraud-APT-汇报-基础模型与LR相关内容总结-KG-cs224w colab1-ctf rce41-44
    数据库引擎——INNODB和MYISAM的比较
    计算机网络概述
    【fiddler学习问题记录】——手机端证书下载页打不开、无法将此证书安装(已解决)
    流程控制break关键字
    innovus:stripe下不放std cell的命令
    mysql字符转换时的注意事项
  • 原文地址:https://blog.csdn.net/HYZX_9987/article/details/126841484