21

私はpostgreSQL 9.1を使用しています。私のデータベースには、次のようなテーブルがあります

id | ... | values
-----------------------
1  | ... | {1,2,3}
2  | ... | {}

ここで、id は整数で、values は整数配列です。配列は空にすることができます。

このリストのネストを解除する必要があります。問い合わせたら

select id, ..., unnest(values)
from table

id = 1 の 3 つの行を取得し (予想どおり)、id = 2 の行を取得しません。次のような結果を取得する方法はありますか?

id  | ... | unnest
-------------------
1   | ... | 1
1   | ... | 2
1   | ... | 3
2   | ... | null

つまり、空の配列を持つ行も含むクエリですか?

4

5 に答える 5

23
select id, 
       case 
         when int_values is null or array_length(int_values,1) is null then null
         else unnest(int_values)
       end as value
from the_table;

values(列の名前をint_valuesasに変更したことに注意してください。これvaluesは予約語であり、列名として使用しないでください)。

SQLFiddle: http://sqlfiddle.com/#!1/a0bb4/1


Postgres 10 では、unnest()そのような使用は許可されなくなりました。

横結合を使用する必要があります。

select id, t.i
from the_table
   cross join lateral unnest(coalesce(nullif(int_values,'{}'),array[null::int])) as t(i);

オンライン例: http://rextester.com/ALNX23313


交差結合の代わりに左結合を使用すると、さらに単純化できます。

select id, t.i
from the_table
 left join lateral unnest(int_values) as t(i) on true;

オンライン例: http://rextester.com/VBO52351

于 2013-03-02T14:24:41.347 に答える
1
select id,
    unnest (
        "values"
        ||
        (array[null]::integer[])[1:(array_upper("values", 1) is null)::integer]
    )
from "table"
于 2013-03-02T15:31:35.447 に答える
0

次のように、 selfを使用する必要がありますLEFT JOINSQL Fiddleでも):

SELECT t.id, u.u
  FROM tab t
  LEFT JOIN (SELECT id, unnest(vals) u FROM tab) u
    USING (id);

テーブルが大きい場合、クエリのパフォーマンスが低下することに注意してください。

于 2013-03-02T14:18:04.983 に答える