Выбор подмножества столбцов в таблице на основе их имен с использованием SQL

У меня есть таблица в Postgres DB, которая имеет много столбцов, таких как "id, name, a01, a02, a03, ..., a20, b, c, d, e, f". Я хочу проверить, имеет ли какой-либо из этих столбцов "aXX" значение "Y". Я знаю тривиальный путь:

SELECT name FROM table T 
WHERE T.a01 = Y OR T.a02 = Y OR ... OR T.a20 = Y

Мне было интересно, если есть какой-либо способ использовать цикл или вложенный запрос выбора, основанный на этих именах столбцов, так как они имеют шаблон, а не жестко кодировать их по отдельности в ГДЕ?

Заранее спасибо.

2 ответа

Решение

Невозможно в SQL, но...

Вы можете сделать это в PostgreSQL

Если вам нужен только идентификатор, имя поля (ключ) и значение, которое вы можете написать:

select d.id, e.key, e.value
  from the_data d, jsonb_each_text(to_jsonb(d.*)) e
  where value::integer = -1;

Если вы хотите строку, вы можете:

select * 
  from the_data
  where id in (
    select d.id
      from the_data d, jsonb_each_text(to_jsonb(d.*))
      where value::integer = -1
  );

Смотрите текущий пример в: http://rextester.com/CRGXPS45970

РЕДАКТИРОВАНИЕ

Вы можете фильтровать поля или что вы хотите. Например:

select d.id, e.key, e.value
  from the_data d, jsonb_each_text(to_jsonb(d.*)) e
  where value::integer = -1 and key like 'a%';

select * 
  from the_data
  where id in (
    select d.id
      from the_data d, jsonb_each_text(to_jsonb(d.*))
      where value::integer = -1 and key like 'a%'
  );

Вы можете увидеть это здесь: http://rextester.com/EESKX21438

Там нет никакого способа сделать именно то, что вы хотите сделать. Вы могли бы сначала выполнить другой запрос, чтобы получить все имена столбцов, а затем обработать ваш результат в PHP, но я думаю, что это даже сложнее, чем просто записывать имена столбцов.

Другие вопросы по тегам