后台:我正在将数据库表转换为不支持空值的格式。我想用任意数字替换空值,以便我的应用程序可以支持空值。
问题:我想在整个表格中搜索一个值(例如“999999”),以确保它不会出现在表格中。我可以编写一个脚本来单独测试每个列,但我想知道是否有一种方法可以在纯sql中执行此操作而无需枚举每个字段。这可能吗?
答案 0 :(得分:4)
您可以使用PostgreSQL类型系统的特殊功能:
SELECT *
FROM tbl t
WHERE t::text LIKE '%999999%';
在PostgreSQL中创建的每个表都有一个composite type的相同名称。并且PostgreSQL中的每种类型都有text
表示(输入/输出值)。
因此,您可以将整行转换为text
,如果字符串'999999'包含在任何列中(确切地说是其text
表示),则可以保证在查询中显示上方。
但是,如果Postgres用于行表示的分隔符和/或装饰符可以是搜索词的一部分,则不能完全排除误报。它只是非常不太可能。对于您的搜索字词'999999',情况并非如此。
最近在codereview.SE上有一个非常类似的问题。我添加了some more explanation in my answer there。
答案 1 :(得分:0)
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)