如何在 PostgreSQL 中获得唯一的数组?

Eva*_*oll 12 postgresql array

下列

SELECT ARRAY[a,b,c,d]
FROM ( VALUES
  ('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)

{foo,bar,foo,baz}类型的返回text[]。我想获得删除重复元素之一的{foo,bar,baz}类型?PostgreSQL 是否有一个独特的函数可以处理文本数组或of ?text[] baranyarrayanyelement

Eva*_*oll 21

虽然没有实现这一点的功能,但您可以使用

  1. unnest() 将元素数组转换为一列的行表,
  2. DISTINCT 删除重复项
  3. ARRAY(query) 重新创建行。

这个成语看起来像,

ARRAY( SELECT DISTINCT ... FROM unnest(arr) )
Run Code Online (Sandbox Code Playgroud)

在实践中是这样应用的,

SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e))
FROM ( VALUES
  ('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)

如果你想要它排序,你可以做,

SELECT ARRAY(SELECT DISTINCT e FROM unnest(ARRAY[a,b,c,d]) AS a(e) ORDER BY e)
FROM ( VALUES
  ('foo', 'bar', 'foo', 'baz' )
) AS t(a,b,c,d);
Run Code Online (Sandbox Code Playgroud)

而这一切可以能写有CROSS JOIN LATERAL多的清洁剂,

SELECT ARRAY(
  SELECT DISTINCT e
  FROM ( VALUES
    ('foo', 'bar', 'foo', 'baz' )
  ) AS t(a,b,c,d)
  CROSS JOIN LATERAL unnest(ARRAY[a,b,c,d]) AS a(e)
  -- ORDER BY e; -- if you want it sorted
);
Run Code Online (Sandbox Code Playgroud)
  • 由 irc.freenode.net/#postgresql 上的 RhodiumToad 启发的答案