【问题标题】:PostgreSQL accessing the 1st element of the recordPostgreSQL 访问记录的第一个元素
【发布时间】:2013-06-16 00:45:52
【问题描述】:

我有一个返回记录类型的函数:

  CREATE OR REPLACE FUNCTION 
          a()
          RETURNS record AS '$lib/lib', 'a'
          LANGUAGE C VOLATILE STRICT COST 1;

该函数返回具有两个属性的记录:布尔值和文本,我可以通过选择查询来检索:

  SELECT status, log 
  FROM a() as (status boolean, log text);

是否有可能在as (status, log) 的帮助下以某种方式访问​​记录的元素而不转换它们? a()[0]a()[1] 之类的东西?

【问题讨论】:

    标签: sql postgresql record


    【解决方案1】:

    您可以在创建函数时指定列名。您应该将函数创建为返回表:

    CREATE OR REPLACE FUNCTION 
          a()
          RETURNS table(status boolean, log text) AS '$lib/lib', 'a'
          LANGUAGE C VOLATILE STRICT COST 1;
    

    然后可以在调用时使用这些列名。

    你可以这样称呼它:

    select status, log
    from a()
    

    函数“知道”列名是什么。

    【讨论】:

    • status和log不都是a()函数的参数吗?我的意思是我们想给输出而不是输入命名,对吧?
    • 有没有办法给输出命名?我知道记录类型非常笼统,并且正在分配结构,因为正在调用函数是语句(这有点令人失望..)
    • 这很酷。使用此 SQL 函数,我可以方便地一次检索一列:select status from a(); 是否可以在没有 from a() 部分的情况下访问该列?类似于select a().status?
    • @亚瑟。 . .您可以尝试一下并找出答案。我认为将它放在from 子句中要好得多,而且我最近才知道你可以用generate_series() 做你所要求的。
    • @亚瑟。 . .现在我明白了。也许这会帮助stackoverflow.com/questions/4547672/…
    【解决方案2】:

    好吧,您可以将它们都转换为文本,并从中创建一个数组,但我认为这不是您要寻找的:

    with q as (
        select array[ status::text, log ] as x from a() as (status bool, log text)
    )
    select x[1], x[2] from q;
    

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      相关资源
      最近更新 更多