2

私がこれまでに見つけたのは

select ARRAY(
   select unnest(ARRAY[ 'a', 'b', 'c' ])
   except
   select unnest(ARRAY[ 'c', 'd', 'e' ])
)

これを行うと、2 つの文字列配列間で一致しない要素のみを見つけることができます。

これを行うための他の最良の方法はありますか?

整数配列のように、これを行うことができます

SELECT int[1,2,3] - int[2,3]
4

2 に答える 2

1

別の方法を次に示します。

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;
于 2013-02-25T13:18:16.447 に答える
1
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
于 2013-02-25T13:09:37.097 に答える