zoukankan      html  css  js  c++  java
  • [PostgreSQL]PostgreSQL 的generate_subscripts

    开始

    生成数组下标值:

    postgres=# select generate_subscripts( array['a','b','c','d'],1);
     generate_subscripts 
    ---------------------
                       1
                       2
                       3
                       4
    (4 rows)
    
    postgres=# select generate_subscripts( array[array['a','b'],array['c','d'],array['e','f']],1);
     generate_subscripts 
    ---------------------
                       1
                       2
                       3
    (3 rows)
    
    postgres=# select generate_subscripts( array[array['a','b'],array['c','d'],array['e','f']],2);
     generate_subscripts 
    ---------------------
                       1
                       2
    (2 rows)
    postgres=# 

    再看一个 postgresql 的官方例子:

    http://www.postgresql.org/docs/8.4/static/xfunc-sql.html

    CREATE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
        SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i);
    $$ LANGUAGE SQL;
    
    SELECT mleast(10, -1, 5, 4.4);
     mleast 
    --------
         -1
    (1 row)
    postgres=# select mleast(10.1,3,4,1.5);
     mleast 
    --------
        1.5
    (1 row)
    
    postgres=# 

    对其中的 SELECT min($1[i]) FROM generate_subscripts($1, 1) g(i), 感觉还是有一点费解的。

    没有关系,让我来作几个实验:

    postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
    postgres$#     SELECT $1[2]  FROM generate_subscripts($1, 1) g(i);
    postgres$# $$ LANGUAGE SQL;
    CREATE FUNCTION
    postgres=# 
    postgres=# select mleast(10.1,1.1,2.2,4.4);
     mleast 
    --------
    1.1
    (1 row)
    
    postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
    postgres$#     SELECT $1[3]  FROM generate_subscripts($1, 1) g(i);
    postgres$# $$ LANGUAGE SQL;
    CREATE FUNCTION
    postgres=# 
    postgres=# select mleast(10.1,1.1,2.2,4.4);
     mleast 
    --------
    2.2
    (1 row)
    
    postgres=# 

    再把 g(i) 换个名称试验一下:

    postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
    postgres$#     SELECT $1[2]  FROM generate_subscripts($1, 1) gao(i);
    postgres$# $$ LANGUAGE SQL;
    CREATE FUNCTION
    postgres=# 
    postgres=# select mleast(10.1,1.1,2.2,4.4);
     mleast 
    --------
    1.1
    (1 row)
    
    postgres=# 
    postgres=# CREATE or REPLACE FUNCTION mleast(VARIADIC numeric[]) RETURNS numeric AS $$
    postgres$#     SELECT min($1[i]) FROM generate_subscripts($1, 1) gao(i);
    postgres$# $$ LANGUAGE SQL;
    CREATE FUNCTION
    postgres=# 
    postgres=# select mleast(10.1,1.1,2.2,4.4);
     mleast 
    --------
    1.1
    (1 row)
    
    postgres=# 

    [作者:技术者高健@博客园  mail: luckyjackgao@gmail.com ]

    可以看到,所谓 g(i) 就是把 generate_subscripts($1,1) 的下标拿到,形成一个数组。第(i)个元素就是 g(i)。

    而min($1[i]) 却是个集合运算,此时 $1[i] 其实代表了 $1[1],$1[2],$1[3]... ,是集合。虽然这看上去有些诡异。 

    结束

  • 相关阅读:
    springboot开发之配置Servlet三大组件(Servlet、Filter、Listener)
    springboot开发之配置嵌入式Servlet容器两种方式
    springboot开发之利用idea自带的插件模拟客户端请求
    springboot开发之配置自定义的错误界面和错误信息
    springboot开发之删除员工
    springboot开发之修改员工
    springboot开发之添加员工
    springboot开发之thymeleaf页面公共元素的抽取
    oracle 创建表、删除表、添加字段、删除字段、表备注、字段备注、修改表属性
    C#拼装JSON数组简易方法
  • 原文地址:https://www.cnblogs.com/gaojian/p/2762523.html
Copyright © 2011-2022 走看看