【问题标题】:Determine size of input array plpgsql确定输入数组 plpgsql 的大小
【发布时间】:2012-10-05 08:01:41
【问题描述】:

我有一个 plpgsql 函数,它以整数 [] 作为输入。

整个设置可以在这个问题中找到: Passing a record as function argument PL/pgSQL

短版: 我有一个从书籍到作者的 n 到 m 关系,有一个名为 books_author 的链接表。我现在有一个看起来像这样的函数:

    create function f_insert_books(title varchar, isbn varchar, publisher varchar,  
      author_id integer[]) returns void as $$
      begin
      --insert book
      --insert link to authors into the books_author table
      end;
    $$ language plpgsql;

我现在想将 number_of_authors 添加到书中。是否有一种简单的方法来确定 author_id 数组的大小,或者您是否建议将“number_of_authors int”作为输入参数传递?

我找到了这个建议,但我有点担心这种方法的性能。所以也许有一些更容易/更快的东西。 http://archives.postgresql.org/pgsql-sql/2000-06/msg00169.php

非常感谢您的帮助。

【问题讨论】:

    标签: postgresql plpgsql


    【解决方案1】:

    使用array_length:

    SELECT array_length( ARRAY[1,2,3], 1 );
    

    第二个参数是您感兴趣的维度。大多数数组是一维的,因此在大多数情况下 1 是正确的值。

    如果您实际上是在查找 text 数组中所有字符串的长度,请使用 array_to_stringlength

    SELECT length(array_to_string( ARRAY['a','bb','ccc'], '' ));                                                                                                         
    

    顺便说一句,您链接到的文章已有 12 年历史,看起来完全过时了。

    【讨论】:

      【解决方案2】:

      还有一个函数可以获取数组的长度 - cardinality:

      SELECT cardinality(ARRAY[1,2,3]);
      

      对于一个简单的一维数组,它的工作方式相同,并且不需要在array_length 函数中传递任何额外的参数,例如数组维度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2020-11-13
        • 2014-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2016-02-10
        相关资源
        最近更新 更多