2016-06-02 5 views
0

У меня есть схемы с около 3000 таблиц в PostgreSQL БД, все они имеют один ряд с колонками:PostgreSQL - Выбор таблиц, где определенный столбец нет

id, area, use, geom, site_id

Однако я только что обнаружил, что есть хотя бы одна таблица, которая пропускает столбец site_id. Мне интересно, если их больше ... Как я могу запросить таблицы, не имеющие столбца site_id?

Моя следующая идея не работает. Какие-либо предложения?

SELECT table_name 
FROM information_schema.columns 
WHERE table_schema = 'schema_A' AND column_name NOT LIKE 'site_id' 
GROUP BY table_name; 

ответ

3

Простой способ будет подсчитывать, сколько раз side_id появляется в перечислении колонке этой таблицы. Если сумма равна нулю, то таблица не имеет site_id:

SELECT table_name 
FROM information_schema.columns 
WHERE table_schema = 'schema_A' 
GROUP BY table_name 
HAVING SUM(CASE WHEN column_name LIKE 'site_id' THEN 1 ELSE 0 END) = 0; 

Я также не уверен, что это было сделано намеренно или нет, но LIKE 'site_id' будет иметь тот же эффект, как = 'site_id'. Если вы хотите проверить, содержит ли он site_id, то более подходящим является LIKE '%site_id%'.

+0

Я предполагаю, что это было предназначено, чтобы точно сравнить имя столбца с литеральным 'site_id' ... – Dilettant

+0

@andrasz: Нет фильтров предложения HAVING, вы получаете имена таблиц в соответствии с списком SELECT. Просто попробуйте - я сделал ;-) (комментарий OP был удален) – Dilettant

+1

@ Dilettant: Да, вы были правы: я просто искал «site_id», и да, это работает. Все мои описанные (и теперь удаленные) сомнения исчезли после того, как они пробовали код;) Спасибо, мистер Ллама! – andrasz

Смежные вопросы