私がこれまでに見つけたのは
select ARRAY(
select unnest(ARRAY[ 'a', 'b', 'c' ])
except
select unnest(ARRAY[ 'c', 'd', 'e' ])
)
これを行うと、2 つの文字列配列間で一致しない要素のみを見つけることができます。
これを行うための他の最良の方法はありますか?
整数配列のように、これを行うことができます
SELECT int[1,2,3] - int[2,3]
私がこれまでに見つけたのは
select ARRAY(
select unnest(ARRAY[ 'a', 'b', 'c' ])
except
select unnest(ARRAY[ 'c', 'd', 'e' ])
)
これを行うと、2 つの文字列配列間で一致しない要素のみを見つけることができます。
これを行うための他の最良の方法はありますか?
整数配列のように、これを行うことができます
SELECT int[1,2,3] - int[2,3]
別の方法を次に示します。
select ARRAY
(
(
select unnest(ARRAY[ 'c', 'd', 'e' ])
except
select unnest(ARRAY[ 'a', 'b', 'c' ])
)
union
(
select unnest(ARRAY[ 'a', 'b', 'c' ])
except
select unnest(ARRAY[ 'c', 'd', 'e' ])
)
);
または (2 つの異なる配列が関係していることをより明確にするため):
with array_one (e) as (
select unnest(ARRAY[ 'a', 'b', 'c' ])
), array_two (e) as (
select unnest(ARRAY[ 'c', 'd', 'e' ])
)
select array(
(
select e from array_one
except
select e from array_two
)
union
(
select e from array_two
except
select e from array_one
)
) t;
array(...)
要素の順序が重要な場合は、(コンストラクターを使用する代わりに) 完了したように array_agg() を Clodoaldo Neto として使用する必要があります。
with array_one (e) as (
select unnest(ARRAY[ 'a', 'b', 'c' ])
), array_two (e) as (
select unnest(ARRAY[ 'c', 'd', 'e' ])
)
select array_agg(e order by e)
from (
(
select e from array_one
except
select e from array_two
)
union
(
select e from array_two
except
select e from array_one
)
) t;
select array_agg(e order by e)
from (
select e
from
(
select unnest(array[ 'a', 'b', 'c' ])
union all
select unnest(array[ 'c', 'd', 'e' ])
) u (e)
group by e
having count(*) = 1
) s