postgresql 在Postgres中只从多个列中查找不同的值

i86rm4rw  于 12个月前  发布在  PostgreSQL
关注(0)|答案(3)|浏览(184)

让我们假设一个这样的Postgres表

CREATE TABLE example (
  value_1 VARCHAR(255),
  value_2 VARCHAR(255),
  value_3 VARCHAR(255),
  value_4 VARCHAR(255),
  value_5 VARCHAR(255)
);

字符串
每一行的每一列都有不同的值,每一行都有相同的值,但在不同的列中。

INSERT INTO
  example
VALUES
  ('a', 'b', 'c', 'd', 'e'),
  ('b', 'c', 'd', 'e', 'a'),
  ('c', 'd', 'e', 'a', 'b'),
  ('d', 'e', 'a', 'b', 'c'),
  ('e', 'a', 'b', 'c', 'd');


屈服

# SELECT * FROM example;
 value_1 | value_2 | value_3 | value_4 | value_5 
---------+---------+---------+---------+---------
 a       | b       | c       | d       | e
 b       | c       | d       | e       | a
 c       | d       | e       | a       | b
 d       | e       | a       | b       | c
 e       | a       | b       | c       | d
(5 rows)


如何选择跨越多行的多个列之间的所有唯一值,以便只得到一个具有不同值'a''b''c''d''e'的列列表?不知道每个值是否存在于每列中以及值的顺序。

polhcujo

polhcujo1#

在阅读了@Andrei Odegov的unnest之后,看起来该函数可以返回多行。要从任何行或列返回唯一值:

select  distinct unnest(array[value_1, value_2, value_3, value_4, value_5])
from    example

字符串

qvsjd97n

qvsjd97n2#

您有一个包含相关值的表,但在查询中您并不关心这些关系;您只想知道表中存在哪些值。
一种将所有值相同对待的方法是为每列编写一个查询,然后将结果合并:

select value_1 as value from mytable
union
select value_2 as value from mytable
union
select value_3 as value from mytable
union
select value_4 as value from mytable
union
select value_5 as value from mytable
order by value;

字符串

5hcedyr0

5hcedyr03#

检查使用unnest数组函数的解决方案。但是像'ab', '', 'c', 'd', 'e'这样的前导/尾随空格或数据呢?:

select version();
-- drop table if exists example;

CREATE TABLE example (
  value_1 VARCHAR(255),
  value_2 VARCHAR(255),
  value_3 VARCHAR(255),
  value_4 VARCHAR(255),
  value_5 VARCHAR(255)
);

INSERT INTO example
VALUES
  ('a ', 'b', 'c', 'd', 'e'),
  ('b', 'c', 'd', 'e', 'a'),
  (' c', 'd', 'e', 'a', 'b'),
  ('d', ' e ', 'a', 'b', 'c'),
  ('e', 'a', 'b', 'c', 'd'),
  ('ab', '', 'c', 'd', 'e');

with
  t1 as (
    select
      row_number() over(order by 0) as id,
      unnest(array[value_1, value_2, value_3, value_4, value_5]) as val
    from example
  )
select distinct
  string_agg(val, '' ORDER BY val) as val
from t1
group by id
;

字符串
结果如下:

val   
---------
 ab cde
 a bcde
 abcde
 abcd e


</>OneCompiler上试试。

相关问题