繁体   English   中英

PostgreSQL:如何访问匿名记录上的列

[英]PostgreSQL: How to access column on anonymous record

我有一个正在处理的问题。 以下是显示问题的简化查询:

WITH the_table AS (
    SELECT a, b 
    FROM (VALUES('data1', 2), ('data3', 4), ('data5', 6)) x (a, b)
), my_data AS (
    SELECT 'data7' AS c, array_agg(ROW(a, b)) AS d
    FROM the_table
)
SELECT c, d[array_upper(d, 1)]
FROM my_data

在我的数据部分,您会注意到我正在从多行创建一个数组,并且该数组与其他数据在一行中返回。 此数组需要包含ab的信息,并将两个值链接在一起。 似乎有意义的是使用匿名行或记录(我想避免实际创建复合类型)。

这一切都很好,直到我需要开始提取数据。 在上面的例子中,我需要访问数组中的最后一个条目,这可以通过使用array_upper轻松完成,但随后我需要访问以前是b列的值,我不知道该怎么做。

本质上,现在上面的查询正在返回:

"data7";"(data5,6)"

我需要回来

"data7";6

我怎样才能做到这一点?

注意:虽然在上面的示例中我使用文本和整数作为我的数据类型,但它们不是实际的最终类型,而是用于简化示例。

注意:这是使用 PostgreSQL 9.2

编辑:为了澄清,像SELECT 'data7', 6这样的东西不是我想要的。 想象一下 the_table 实际上是从数据库表中提取的,而不是我为了方便而放入的 WITH 语句,而且我并不容易知道表中有什么数据。

换句话说,我希望能够做这样的事情:

SELECT c, (d[array_upper(d, 1)]).b
FROM my_data

把这个拿回来:

"data7";6

本质上,一旦我使用 row() 函数将某些内容放入匿名记录中,我该如何取回它? 如何拆分'data5'部分和6部分,以便它们不会同时返回一列?

再举一个例子:

SELECT ROW('data5', 6)

使 'data5' 和 6 在一列中返回。 我如何取那一列并将其分解回原来的两列?

我希望澄清

如果您可以安装hstore扩展:

with the_table as (
    select a, b
    from (values('data1', 2), ('data3', 4), ('data5', 6)) x (a, b)
), my_data as (
    select 'data7' as c, array_agg(row(a, b)) as d
    from the_table
)
select c, (avals(hstore(d[array_upper(d, 1)])))[2]
from my_data
;
   c   | avals 
-------+-------
 data7 | 6

这只是围绕一个类似问题的快速组合 - 不是您问题的答案。 这似乎是识别列的一个方向。

with x as (select 1 a, 2  b union all values (1,2),(1,2),(1,2))
select a from x;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM