Проверить целую таблицу на одно значение - PullRequest
2 голосов
/ 03 апреля 2012

Справочная информация: Я преобразовываю таблицу базы данных в формат, который не поддерживает нулевые значения.Я хочу заменить нулевые значения произвольным числом, чтобы мое приложение могло поддерживать нулевые значения.

Вопрос: Я хотел бы найти значение во всей таблице («999999»,например), чтобы убедиться, что он не отображается в таблице.Я мог бы написать скрипт для проверки каждого столбца в отдельности, но я хотел знать, есть ли способ сделать это в чистом SQL, не перечисляя каждое поле.Это возможно?

Ответы [ 2 ]

4 голосов
/ 03 апреля 2012

Вы можете использовать специальную функцию системы типов PostgreSQL:

SELECT *
FROM   tbl t
WHERE  t::text LIKE '%999999%';

Для каждой таблицы, создаваемой в PostgreSQL, существует составной тип с одинаковым именем. И есть text представление для каждого типа в PostgreSQL (для значений ввода / вывода).

Таким образом, вы можете просто привести всю строку к text, и если строка '999999' содержится в любом столбце (точнее, в представлении text), он гарантированно будет показан в запросе выше.

Вы не можете полностью исключить ложных срабатываний , хотя разделители и / или декораторы, используемые Postgres для представления строки, могут быть частью поискового запроса. Это просто очень маловероятно. И, конечно же, это не относится к вашему поисковому запросу "999999".

Недавно был очень похожий вопрос по codereview.SE. Я добавил еще несколько объяснений в свой ответ там .

0 голосов
/ 03 апреля 2012
create or replace function test_values( real ) returns setof record as
$$
declare
query text;
output record;
begin
for query in select 'select distinct ''' || table_name || '''::text table_name, ''' || column_name || '''::text column_name from '|| quote_ident(table_name)||' where ' || quote_ident(column_name) || ' = ''' || $1::text  ||'''::' || data_type  from information_schema.columns where table_schema='public'   and numeric_precision is not null
loop
    raise notice '%1 qqqq', query;
    execute query::text into output;
    return next output;
end loop;
return;
end;$$ language plpgsql;

select distinct * from test_values( 999999 ) as t(table_name text ,column_name text)
...