在使用 awk 脚本;数组是一大利器;在很多场景是用数组能处理。

在 python 中,数据类型list;相当于array类型。

在 Oracle 中,对 array 不够友好,感觉像是鸡肋。但是在 PostgreSQL 中,对array有很多支持,很多场景可以应用到。下面慢慢说

1、any(array) 替换 in(table)

  1. -- 案例1
  2. -- 创建表A;插入1000条记录;并每条记录重复4
  3. postgres=# create table A (id int, info text);
  4. CREATE TABLE
  5. postgres=# 
  6. postgres=# insert into A select generate_series(1,1000), 'lottu';
  7. INSERT 0 1000
  8. postgres=# 
  9. postgres=# insert into A select generate_series(1,1000), 'lottu';
  10. INSERT 0 1000
  11. postgres=# insert into A select * from A;
  12. INSERT 0 2000
  13. -- in的方式去处理重复数据
  14. postgres=# begin;
  15. BEGIN
  16. postgres=# explain (analyze, costs, timing) delete from A where ctid not in (select min(ctid) from A group by id, info);
  17.                                                         QUERY PLAN                                                         
  18. ---------------------------------------------------------------------------------------------------------------------------
  19.  Delete on a  (cost=74.38..131.31 rows=1397 width=6) (actual time=12.619..12.619 rows=0 loops=1)
  20.    ->  Seq Scan on a  (cost=74.38..131.31 rows=1397 width=6) (actual time=5.146..7.129 rows=3000 loops=1)
  21.          Filter: (NOT (hashed SubPlan 1))
  22.          Rows Removed by Filter: 1000
  23.          SubPlan 1
  24.            ->  HashAggregate  (cost=70.89..73.69 rows=279 width=42) (actual time=3.762..4.155 rows=1000 loops=1)
  25.                  Group Key: a_1.id, a_1.info
  26.                  ->  Seq Scan on a a_1  (cost=0.00..49.94 rows=2794 width=42) (actual time=0.017..1.158 rows=4000 loops=1)
  27.  Planning Time: 1.923 ms
  28.  Execution Time: 44.130 ms
  29. (10 rows)
  30. -- any(array)的方式处理
  31. postgres=# explain (analyze, costs, timing) delete from A
  32. postgres-#  where ctid = any(array (select ctid
  33. postgres(#                      from (select "row_number"() over(partition by id, info) as rn,
  34. postgres(#                                   ctid
  35. postgres(#                              from A) as ad
  36. postgres(#                     where ad.rn > 1));
  37.                                                            QUERY PLAN                                                            
  38. ---------------------------------------------------------------------------------------------------------------------------------
  39.  Delete on a  (cost=300.69..340.79 rows=10 width=6) (actual time=17.686..17.686 rows=0 loops=1)
  40.    InitPlan 1 (returns $0)
  41.      ->  Subquery Scan on ad  (cost=209.87..300.68 rows=931 width=6) (actual time=3.995..9.503 rows=3000 loops=1)
  42.            Filter: (ad.rn > 1)
  43.            Rows Removed by Filter: 1000
  44.            ->  WindowAgg  (cost=209.87..265.75 rows=2794 width=50) (actual time=3.986..8.570 rows=4000 loops=1)
  45.                  ->  Sort  (cost=209.87..216.86 rows=2794 width=42) (actual time=3.974..4.577 rows=4000 loops=1)
  46.                        Sort Key: a_1.id, a_1.info
  47.                        Sort Method: quicksort  Memory: 284kB
  48.                        ->  Seq Scan on a a_1  (cost=0.00..49.94 rows=2794 width=42) (actual time=0.015..1.486 rows=4000 loops=1)
  49.    ->  Tid Scan on a  (cost=0.01..40.11 rows=10 width=6) (actual time=11.130..12.945 rows=3000 loops=1)
  50.          TID Cond: (ctid = ANY ($0))
  51.  Planning Time: 0.619 ms
  52.  Execution Time: 17.808 ms
  53. (14 rows)
  54. 结论:
  55. 1、效率大大提升;数据量越大提升效果越好;anyarray 的效果 >= in
  56. 2、判断 array 所含元素的方法,有 any / some (any) 还有 all两种方法

2、array 相关函数

  1. -- string 转换 array
  2. -- 函数 string_to_array
  3. select array_to_string(array[1, 2, 3], '~^~');
  4. array_to_string
  5. -----------------
  6. 1~^~2~^~3
  7. -- 函数 string_to_array
  8. select string_to_array('1~^~2~^~3','~^~');
  9. string_to_array
  10. -----------------
  11. {1,2,3}
  12. -- 函数 regexp_split_to_array;跟string_to_array有点类似
  13. select regexp_split_to_array('1~^~2~^~3','\~\^\~');
  14. regexp_split_to_array
  15. -----------------------
  16. {1,2,3}
  17. -- 函数 unnest
  18. select unnest(array['a', 'b', 'c']);
  19. unnest
  20. --------
  21. a
  22. b
  23. c
  24. -- 还可以结合with ordinality;添加行号
  25. select * from unnest(array['a', 'b', 'c']) with ordinality;
  26. unnest | ordinality
  27. --------+------------
  28. a | 1
  29. b | 2
  30. c | 3

PostgreSQL数组类型应用的更多相关文章

  1. PostgreSQL 数组类型

    PostgreSQL 支持表的字段使用定长或可变长度的一维或多维数组,数组的类型可以是任何数据库内建的类型.用户自定义的类型.枚举类型, 以及组合类型.但目前还不支持 domain 类型. 数组类型的 ...

  2. postgresql —— 数组类型

    创建数组 CREATE TABLE sal_emp ( name text, pay_by_quarter integer[] --还可以定义为integer[4]或integer ARRAY[4] ...

  3. PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】

    前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...

  4. mybatis 处理数组类型及使用Json格式保存数据 JsonTypeHandler and ArrayTypeHandler

    mybatis 比 ibatis 改进了很多,特别是支持了注解,支持了plugin inteceptor,也给开发者带来了更多的灵活性,相比其他ORM,我还是挺喜欢mybatis的. 闲言碎语不要讲, ...

  5. java中用spring实现数组类型输出

    java 中的几个数组类型 1.Department类 package com.yy.collection; import java.util.List; import java.util.Map; ...

  6. JS数组类型检测

    在强类型语言,数组类型检测是非常容易的事情(typeof就可以解决),而在弱语言JS数据类型就很容易混淆了. JS中常见的数据类型有:number.string.boolean.undefined.f ...

  7. C语言 数组类型与数组指针类型

    //数组类型与数组指针类型 #include<stdio.h> #include<stdlib.h> #include<string.h> void main(){ ...

  8. delphi 数组类型与数组指针的巧妙利用

    {本例通过存取结构, 慢慢引入了数组类型与指针的一些使用方法; 其中六个小例子的测试内容和结果都是一样的. ---------------------------------------------- ...

  9. delphi 数组类型

    数组类型 数组类型定义了一组指定类型的元素序列,在方括号中填入下标值就可访问数组中的元素.定义数组时,方括号也用来指定可能的下标值.例如,下面的代码中定义了一个有 24 个整数的数组:type     ...

随机推荐

  1. Http请求-okhttp3基本用法

    简介 HTTP是现代应用常用的一种交换数据和媒体的网络方式,高效地使用HTTP能让资源加载更快,节省带宽.OkHttp是一个高效的HTTP客户端,它有以下默认特性: 支持HTTP/2,允许所有同一个主 ...

  2. 牛客网数据库SQL实战解析(41-50题)

    牛客网SQL刷题地址: https://www.nowcoder.com/ta/sql?page=0 牛客网数据库SQL实战解析(01-10题): https://blog.csdn.net/u010 ...

  3. Pycharm2019.3永久激活

    1. 下载破解补丁,https://pan.baidu.com/s/1mcQM8CLUnweY02ahKEr4PQ ,下载最新上传的压缩包 2. 将压缩包解压,里面有激活文件ACTIVATION_CO ...

  4. nodejs打包成桌面程序(exe)的进阶之路

    nodejs打包成桌面程序(exe)的进阶之路 node js bat 前端 计划任务 前言:最近的研究,请大佬们细品 第一篇 - 任务计划程序篇 说真的研究到将nodejs打包成可执行的exe文件是 ...

  5. OpenSIPS 2.4.2 高并发下,日志丢失怎么办

      问题年年有,今年特别多.最近公司对呼叫中心平台做了大幅度重构,基于OpenSIPS实现的会话管理服务,在高并发压测过程中,发现OpenSIPS的日志居然出现丢失的情况,简直让我食不知味,困惑不已. ...

  6. 2020.08.31 Unit 10(暂未完成)

    [重点短语] 01.at night 在晚上 02.in a more natural environment 在一个更加自然的环境中 03.all year round 一年到头,终年 04.be ...

  7. laravel在视图中使用类似于“__PUBLIC__”,“__UPLOADS__”的操作

    首先在config文件夹下建立static.php文件 然后在里面定义常量 例: <?php define('__PUBLIC__', '/'); define('__UPLOADS__', ' ...

  8. Unity3d启动事件 - InitializeOnLoad

    监听Unity3d启动事件 - InitializeOnLoad http://blog.csdn.net/huutu/article/details/42318499 Unity 监听第一次进入播放 ...

  9. vue学习笔记一

    vue 颠覆式的开发方式 解疑 为什么要学习vue? 降低项目的复杂度 就业需要 vue难不难? 特别简单 相比于React,vue有什么优势? 前端三大框架:Angular.React.Vue Vu ...

  10. 08_Python的数据类型

    1.数字(整型int 浮点型float 复数complex) 1.数字概述 不可变类型,一旦创建不可修改,不是迭代对象,属于原子型 2.整型数int 概述: 整型数是不带有小数部分的数字,包括自然数, ...