Вы можете получить список таблиц с помощью функции plpgsql, которая выполняет динамический SQL и просматривает результаты из каталога. Рассмотрим следующую демонстрацию, протестированную на PostgreSQL 9.1, но она должна работать как минимум с версией 8.4 или даже более старой:
CREATE OR REPLACE FUNCTION f_tbl_with_value(numeric)
RETURNS SETOF text AS
$BODY$
DECLARE
_tbl text;
BEGIN
FOR _tbl IN
SELECT DISTINCT quote_ident(n.nspname) || '.' || quote_ident(c.relname)
FROM pg_catalog.pg_attribute a
JOIN pg_catalog.pg_class c ON c.oid = a.attrelid
JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE a.attname = 'ad_client_id'
AND a.attisdropped = FALSE -- column hasn't been dropped
AND n.nspname = 'myschema' -- search only this schema
AND c.relkind = 'r' -- only real tables
LOOP
RETURN QUERY EXECUTE '
SELECT ''' || _tbl || '''::text
WHERE EXISTS (
SELECT *
FROM ' || _tbl || '
WHERE ad_client_id = $1
)'
USING $1;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
Звоните:
SELECT * FROM x.f_tbl_with_value(100000)
Основные баллы
Результатом является список имен таблиц, в которых существует столбец ad_client_id
и который содержит значение параметра хотя бы в одной строке.
Я использую каталог PostgreSQL. Вы можете сделать то же самое со стандартной информационной схемой SQL, как вы продемонстрировали в своем комментарии. Но это намного медленнее и полезно, только если вы хотите, чтобы ваш код был переносимым. Так как эта функция plpgsql в любом случае не переносима на другие системы баз данных, я использую более быстрые таблицы каталога PostgreSQL.
Обратите внимание, как я использую простой SQL для получения имен таблиц, но динамический SQL для их запроса.
Обратите внимание, как я использую quote_ident()
в схеме и имени таблицы для защиты от внедрения SQL и автоматического сохранения идентификаторов смешанного регистра, если это необходимо.
Я использовал строчную строку 'ad_client_id'
для имени столбца. Или вам на самом деле нужен верхний регистр, потому что вы дважды цитировали "AD_CLIENT_ID"
при его создании? (Я обычно советую использовать только строчные идентификаторы. Подробнее об этом в руководстве. )