背景:我正在将数据库表转换为不支持空值的格式。我想用任意数字替换空值,这样我的应用程序就可以支持空值。
问题:我想在整个表中搜索一个值(例如“999999”),以确保它不会出现在表中。我可以编写一个脚本来单独测试每一列,但我想知道是否有一种方法可以在纯sql中做到这一点,而不必枚举每个字段。有可能吗?

最佳答案

您可以使用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

10-08 04:37