Как я могу сократить список так, чтобы

WHERE id IN ('8893171511',

'8891227609',
'8884577292',
'886790275X',
.
.
.)

Становится

WHERE id IN (name of a group/list) 
1
Edoardo Maschio 20 Авг 2018 в 16:38

3 ответа

Лучший ответ

Если список большой, я бы создал временную таблицу и сохранил список там.

Таким образом, вы можете ANALYZE временную таблицу и получить точные оценки.

0
Laurenz Albe 20 Авг 2018 в 13:42

Предлагаемая временная таблица и ответы 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[]);
0
Y.S 20 Авг 2018 в 13:49

Список действительно должен где-то появиться. С точки зрения возможности сопровождения и повторного использования вашего кода вы можете представить список в 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')
)
1
Tim Biegeleisen 20 Авг 2018 в 13:54
51931991