Sql 检查整个表中的单个值

Sql 检查整个表中的单个值,sql,postgresql,types,null,pattern-matching,Sql,Postgresql,Types,Null,Pattern Matching,背景:我正在将数据库表转换为不支持空值的格式。我想用任意数字替换空值,这样我的应用程序就可以支持空值 问题:我想在整个表中搜索一个值(“9999999”,例如),以确保它不会出现在表中。我可以编写一个脚本来单独测试每一列,但我想知道是否有一种方法可以在纯sql中实现这一点,而不必枚举每个字段。这可能吗?您可以使用PostgreSQL类型系统的一个特殊功能: SELECT * FROM tbl t WHERE t::text LIKE '%999999%'; 在PostgreSQL中创建的

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


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

您可以使用PostgreSQL类型系统的一个特殊功能:

SELECT *
FROM   tbl t
WHERE  t::text LIKE '%999999%';
在PostgreSQL中创建的每个表都有一个相同名称的表。PostgreSQL中的每种类型都有
text
表示(用于输入/输出值)

因此,您可以将整行强制转换为
text
,如果字符串“9999999”包含在任何列中(准确地说,它的
text
表示形式),则保证在上面的查询中显示

但是,如果Postgres用于行表示的分隔符和/或装饰符可以作为搜索词的一部分,则不能完全排除误报。这不太可能。而你的搜索词“999999”肯定不是这样


最近在codereview.SE上有一个非常类似的问题。我补充道。

您可以使用PostgreSQL类型系统的一个特殊功能:

SELECT *
FROM   tbl t
WHERE  t::text LIKE '%999999%';
在PostgreSQL中创建的每个表都有一个相同名称的表。PostgreSQL中的每种类型都有
text
表示(用于输入/输出值)

因此,您可以将整行强制转换为
text
,如果字符串“9999999”包含在任何列中(准确地说,它的
text
表示形式),则保证在上面的查询中显示

但是,如果Postgres用于行表示的分隔符和/或装饰符可以作为搜索词的一部分,则不能完全排除误报。这不太可能。而你的搜索词“999999”肯定不是这样


最近在codereview.SE上有一个非常类似的问题。我补充道。

不要把“sql”放在标题中,这就是标签的目的。不要把“sql”放在标题中,这就是标签的目的。你使用
~
而不是标准的LIKE运算符有什么特殊原因吗?@a_horse_没有名字:没有特殊原因。您可能知道这一点,但对于一般公众来说,一个奇怪的事实是:
~
虽然是相同的运算符,但其排名却高于
等。所以像'a'| |'%'这样的表达式需要带括号的
~
'ab'~('a'| |'%')
。谢谢。不,我不知道关于接线员的事。我尽可能地使用标准SQL(所以我从不使用
~
)。这使得在SQL方言之间切换更加容易。@a_horse_和_no_name:我认为这是一个很好的实践。我修改了我的示例以支持这一点(尽管这是Postgres特有的)。我发现
~~
稍微容易阅读,在
~
(regexp匹配)和
~
之间切换也更容易,而且我主要使用PostgreSQL,所以我喜欢较短的运算符。@ErwinBrandstetter我对SQL不是很熟悉,除了上下文原因,我不知道~~是什么意思。谢谢你的回答。你使用
~
而不是标准的LIKE操作符有什么特别的原因吗?@a\u horse\u with\u no\u name:没有特别的原因。您可能知道这一点,但对于一般公众来说,一个奇怪的事实是:
~
虽然是相同的运算符,但其排名却高于
等。所以像'a'| |'%'这样的表达式需要带括号的
~
'ab'~('a'| |'%')
。谢谢。不,我不知道关于接线员的事。我尽可能地使用标准SQL(所以我从不使用
~
)。这使得在SQL方言之间切换更加容易。@a_horse_和_no_name:我认为这是一个很好的实践。我修改了我的示例以支持这一点(尽管这是Postgres特有的)。我发现
~~
稍微容易阅读,在
~
(regexp匹配)和
~
之间切换也更容易,而且我主要使用PostgreSQL,所以我喜欢较短的运算符。@ErwinBrandstetter我对SQL不是很熟悉,除了上下文原因,我不知道~~是什么意思。谢谢你的回答。