检查整个表格的单个值

时间:2012-04-03 13:57:51

标签: sql postgresql types null pattern-matching

后台:我正在将数据库表转换为不支持空值的格式。我想用任意数字替换空值,以便我的应用程序可以支持空值。

问题:我想在整个表格中搜索一个值(例如“999999”),以确保它不会出现在表格中。我可以编写一个脚本来单独测试每个列,但我想知道是否有一种方法可以在纯sql中执行此操作而无需枚举每个字段。这可能吗?

2 个答案:

答案 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)