Как я могу сократить список так, чтобы
WHERE id IN ('8893171511',
'8891227609',
'8884577292',
'886790275X',
.
.
.)
Становится
WHERE id IN (name of a group/list)
3 ответа
Если список большой, я бы создал временную таблицу и сохранил список там.
Таким образом, вы можете ANALYZE
временную таблицу и получить точные оценки.
Предлагаемая временная таблица и ответы CTE подойдут.
Я просто хотел предложить другой подход, который будет работать, если вы будете использовать PGAdmin для запросов (не уверен насчет рабочей среды) и представлять свои данные в «жестком» виде.
set setting.my_ids = '8893171511,8891227609';
select current_setting('setting.my_ids');
drop table if exists t;
create table t ( x text);
insert into t select 'some value';
insert into t select '8891227609';
select *
from t
where x = any( string_to_array(current_setting('setting.my_ids'), ',')::text[]);
Список действительно должен где-то появиться. С точки зрения возможности сопровождения и повторного использования вашего кода вы можете представить список в CTE:
WITH id_list AS (
SELECT '8893171511' AS id UNION ALL
SELECT '8891227609' UNION ALL
SELECT '8884577292' UNION ALL
SELECT '886790275X'
)
SELECT *
FROM yourTable
WHERE id IN (SELECT id FROM cte);
Если у вас есть постоянная необходимость сделать это, то, возможно, CTE должен стать истинной таблицей где-то в вашей базе данных.
Редактировать: Используя предложение Лошади, мы можем привести CTE в порядок:
WITH id_list (id) AS (
VALUES
('8893171511'),
('8891227609'),
('8884577292'),
('886790275X')
)
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.