当前位置: 首页 > 面试题库 >

如何在PostgreSQL中将数组拆分为行

雍志文
2023-03-14
问题内容

运行此查询时:

  SELECT id,selected_placements
  FROM  app_data.content_cards

我得到一个这样的表:

+----+-------------------------------+
| id | selected_placements           |
+----+-------------------------------+
| 90 | {162,108,156,80,163,155,NULL} |
+----+-------------------------------+
| 91 | {}                            |
+----+-------------------------------+

我现在想做的是获取相同的信息,但是将数组分成几行,所以我得到的结果是这样的:

+----+---------------------+
| id | selected_placements |
+----+---------------------+
| 90 | 162                 |
+----+---------------------+
| 90 | 108                 |
+----+---------------------+
| 90 | 156                 |
+----+---------------------+
| 90 | 80                  |
+----+---------------------+
| 90 | 163                 |
+----+---------------------+
| 90 | 155                 |
+----+---------------------+

如您所见,我不想在“ selected_placements”中获取具有空值的行。

我正在使用PostgreSQL 8.0.2。

非常感谢!


问题答案:

我建议您升级Postgres版本。所有受支持的版本均支持unnest()

SELECT x.*
FROM (SELECT id, UNNEST(selected_placements) as selected_placement
      FROM  app_data.content_cards
     ) x
WHERE selected_placement IS NOT NULL;

在早期版本中,您可以尝试一次将它们选出来。尽管已在9.5中进行了测试,但仍可以正常工作:

with content_cards as (
     select 1 as id, array['a', 'b', 'c'] as selected_placements
    )
SELECT id, selected_placements[num] as selected_placement
FROM (SELECT cc.*, generate_series(1, ccup.maxup) as num
      FROM content_cards cc CROSS JOIN
           (SELECT MAX(ARRAY_UPPER(cc.selected_placements, 1)) as maxup
            FROM content_cards cc
           ) ccup
     ) x
WHERE selected_placements[num]  IS NOT NULL;


 类似资料:
  • 给定一个值数组,我如何将它分成由相等元素组成的? 给定这个数组 我想要这个输出 解决这一问题的一种可能方法是创建某种索引,以指示每个元素的出现情况。 最后使用索引重建输出数组。 但是,使用此解决方案,我会丢失原始值。当然,在这种情况下,这不是一个大问题(一个值仍然存在,即使重新创建,),但我想将此解决方案应用于像这样更复杂的数据结构 实际上,我正在寻找的函数是与相反的函数 我希望我已经说清楚了,如

  • 在Bash脚本中,我希望将一行拆分为几个部分,并将它们存储在数组中。 例如,给定行: 我希望得到的数组如下所示: 一个简单的实现是优选的;速度不重要。我该怎么做呢?

  • 我从基于apache-camel-spark的rest接口获得一个json数组作为输入。开始时,我想通过apache camels路线分割json-array来处理每个元素。我该怎么做? 我的测试输入json: 对于这个问题,我在stackoverflow上找到了一些间接描述的问题: link 1, link 2, link 3。 根据这些示例,我尝试了以下骆驼路线: 当我这样做时,我总是得到以下

  • 问题内容: 假设我有一个如下所示的Javascript数组: 什么方法适合将数组分块(拆分)为更小的数组,最多可以有10个元素? 问题答案: 该array.slice方法可以从一开始,中间,或自己需要的任何目的数组的结束提取切片,在不改变原来的数组。

  • 将输入值绑定到ng模型时,如下所示: 如何将输入文本绑定为数组?所以如果我输入,得到的模型将是。 现在我就是这样做到的: 在我的控制器里: 它工作正常,但我不认为这是最佳实践,因为我正在制作一个变量,然后硬编码目标数组。 是否可以将输入的模型设置到数组中,然后让输入在绑定到作用域之前通过函数?

  • 问题内容: 想象一下,我有一个这样的JS数组: 我想要的是将该数组拆分为N个较小的数组。例如: 对于Python,我有这个: 对于JS,我可以提出的最佳解决方案是递归函数,但我不喜欢它,因为它既复杂又丑陋。这个内部函数返回一个像这样的数组[1,2,3,null,4,5,6,null,7,8],然后我必须再次循环并手动拆分它。(我的第一次尝试是返回此:[1、2、3,[4、5、6,[7、8、9]]],