选择具有多个相同值列的行

时间:2017-04-14 04:54:08

标签: sql postgresql

使用包含以下列的表table1

name, dept, col1, col2, col3, col4, col5

我需要在多个列中找到具有相同值的行 - 例如col2, col3, col4, col5

虽然下面的内容可行,但我需要一种即使对于大量列也能工作的方法,而不必具有多个and条件。

select * 
from table1
where col2 = col3 and col3 = col4 and col4 = col5

4 个答案:

答案 0 :(得分:2)

您可以这样做:

SELECT * FROM table1 
    WHERE (
        SELECT COUNT(*) FROM (
            SELECT DISTINCT UNNEST(ARRAY[col2, col3, col4, col5])
        ) tmp
    ) = 1;

这里的步骤如下:

  1. 将您要匹配的所有列放入数组
  2. 展开(Unnest)数组并删除重复项
  3. 从该数组中获取唯一值的计数
  4. 过滤计数为1的行。

答案 1 :(得分:2)

示例数据..

CREATE TABLE foo
AS
  SELECT id,
    trunc(random()*10) AS col1,
    trunc(random()*10) AS col2,
    trunc(random()*10) AS col3,
    trunc(random()*10) AS col4
  FROM generate_series(1,1e6)
    AS gs(id);

使用ALL

此方法大大缩短,但您仍需要输入一次所有列名称。

SELECT * FROM foo
WHERE col1 = ALL(ARRAY[col2,col3,col4]);

动态sql ..

SELECT format(
  'SELECT * FROM foo WHERE %s;',
  (
    SELECT string_agg('col1 = col'||id, ' AND ')
    FROM generate_series(2,4) AS id
  )
);

答案 2 :(得分:0)

请尝试以下查询

SELECT * FROM table1 WHERE col2 IN(col3,col4,col5) OR col3 IN(col2,col4,col5) OR col4 IN(col3,col2,col5) OR col5 IN(col3,col4,col2);

如果需要任何更改,请告诉我。

答案 3 :(得分:0)

你可以尝试

SELECT * 
FROM table1
WHERE ARRAY_FILL(col2, ARRAY[3]) =  ARRAY[col3, col4, col5]

我创建了一个演示here