Выбор подмножества столбцов в таблице на основе их имен с использованием 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, но я думаю, что это даже сложнее, чем просто записывать имена столбцов.