如何在postgres中将int [] []中的行从int []中提取出来

时间:2017-05-12 18:19:25

标签: arrays postgresql

我对sql数组索引的作用以及索引[]的返回类型应该是什么感到困惑。

我有一个3,2阵列:

select ARRAY[
   [1,1],
   [2,2],
   [3,3]];

--> {{1,1},{2,2},{3,3}}

(顺便说一句,pgadmin3说这是一个“数组整数[]”,而不是“数组整数[] []”。)

假设我想提取第一行(索引从1开始?):

-- A
select (ARRAY[
   [1,1],
   [2,2],
   [3,3]])[1];
--> NULL

咦?为什么不{1,1}(类型int[])。

-- B
select (ARRAY[
   [1,1],
   [2,2],
   [3,3]])[1][:];

--> {{1,1}}
......似乎是合法的。但是:

-- C
select (ARRAY[
   [1,1],
   [2,2],
   [3,3]])[1][:][1];
--> {}   

为什么这与A不同?

如何从int [] [](1d数组)中提取一行作为int [](1d数组)。

2 个答案:

答案 0 :(得分:2)

  

如何从int [] []中提取行作为postgres中的int []

通过聚合未连接的元素:

select array_agg(elem)
from unnest(array[[1,1],[2,2],[3,3]]) elem;

   array_agg   
---------------
 {1,1,2,2,3,3}
(1 row) 

您可以在此信息中找到更多信息:How to get the dimensionality of an ARRAY column?

如果你想获得第二个子阵列:

with my_data(id, arr) as (
values
(1, array[
   [1,1],
   [2,2],
   [3,3]]),
(2, array[
   [1,1,11],
   [2,2,22],
   [3,3,33]])
)

select array_agg(elem)
from my_data, 
unnest(arr[2:2]) elem
group by id;

 array_agg 
-----------
 {2,2}
 {2,2,22}
(2 rows)

注1。符号[2:2]表示从第2个元素到第2个元素的切片,因此它指向第二个子数组。

注意2.多维数组必须具有匹配维度的数组表达式。

答案 1 :(得分:1)

除了klin的答案和使用提供的功能here(带有一些修复):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:orientation="vertical"
android:weightSum="1">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/app_name"
    android:id="@+id/test"
    android:textAppearance="@style/TextAppearance.AppCompat.Display1" />


<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignEnd="@+id/test"
    android:layout_alignParentBottom="true"
    android:layout_alignRight="@+id/test"
    android:clickable="true"
    app:fabSize="mini"
    app:srcCompat="@android:drawable/presence_online" />

<android.support.v7.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:background="?attr/colorPrimary"
    android:contentInsetStart="0dp"
    android:contentInsetLeft="0dp"
    app:contentInsetLeft="0dp"
    app:contentInsetStart="0dp"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>

<android.support.v7.widget.RecyclerView
    android:layout_below="@+id/toolbar"
    android:id="@+id/rv"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>


</RelativeLayout>