Посмотрите, существует ли значение в каком-либо столбце каждой строки в PostgresQL - PullRequest
2 голосов
/ 07 мая 2019

Представляя, что у меня есть эта таблица, я хочу найти бренды, которые существуют для каждого идентификатора.Обратите внимание, что это не эквивалентно нахождению значения для каждой строки, так как один идентификатор может существовать несколько раз.В этом случае я ожидал бы получить результат Mercedes-Benz.

 id |    brand1     |    brand2     |    brand3
----+---------------+---------------+---------------
  1 | Mercedes-Benz |               | Fiat
  2 | Honda         |               | Mercedes-Benz
  3 | Audi          |               | Audi
  3 | Audi          |               | Mercedes-Benz
  4 | Mercedes-Benz |               | Mercedes-Benz
  5 | Mercedes-Benz | Mercedes-Benz |
  5 | Mercedes-Benz | Mercedes-Benz |
  6 | Mercedes-Benz |               | Mercedes-Benz
  7 | Mercedes-Benz | Mercedes-Benz |
  8 | Audi          |               | Audi
  8 | Audi          |               | Mercedes-Benz

Я пытался использовать EXIST, но мне не удалось найти элегантный способ postgresql для итерации встолбцы идентификаторов.

Результат:

  |    brand      |  
  +---------------+
  | Mercedes-Benz | 

Ответы [ 2 ]

4 голосов
/ 07 мая 2019

Отключить данные - я рекомендую использовать боковое соединение - и затем объединить:

select v.brand
from t cross join lateral
     (values (t.brand1), (t.brand2), (t.brand3)) v(brand)
group by brand
having count(distinct t.id) = (select count(distinct t.id) from t);
1 голос
/ 07 мая 2019

Вы можете нормализовать данные (если возможно, измените структуру таблицы, в противном случае вы можете запустить запрос, чтобы построить его на лету)

SELECT id, brand1 AS brand FROM table
UNION
SELECT id, brand2 FROM table
UNION
SELECT id, brand3 FROM table

Оттуда вы можете использовать стандартные функции агрегирования, чтобы найтинеобходимая информация: бренд GROUP BY и COUNT номер ID

...