Выберите только таблицы, в которых столбец содержит определенное числовое значение - PullRequest
0 голосов
/ 19 февраля 2012

Можно ли выбрать только таблицы, в которых столбец (AD_CLIENT_ID) содержит определенное числовое значение (1000000)?

У меня есть 850 таблиц для выбора, и у каждой таблицы есть этот столбец, но не все столбцы содержат 1000000.

Ответы [ 2 ]

2 голосов
/ 19 февраля 2012

хмм ..

  • настоятельно пересмотреть ваш дизайн.
  • Посмотрите на огромную структуру UNION из всех ваших таблиц, затем запросите, где ГДЕ AD_CLIENT_ID = 100000
1 голос
/ 20 февраля 2012

Вы можете получить список таблиц с помощью функции 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" при его создании? (Я обычно советую использовать только строчные идентификаторы. Подробнее об этом в руководстве. )

...