Проверьте всю таблицу на одно значение

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

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

2 ответа

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

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

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

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

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

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


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)

licensed under cc by-sa 3.0 with attribution.