我的表有一些 null 和空字符串,当我查询表时这些看起来很难看,所以我想用其他值替换它们。我不拥有数据,所以我无法修改表本身,这需要在我查询时发生。
我尝试使用
regexp_replace
将空字符串替换为 regexp_replace(column, '^$', '(no value found/some other custom message)'
,但这不起作用
null
和空字符串必须分开处理。另外,''
(空)和' '
(空白)之间有区别。
null
是“未知”。 regexp_replace(null, '^$', 'default')
不执行任何操作,因为它匹配的值未知。匹配失败,返回null
。
coalesce
。它返回第一个非空值。 coalesce(thing, 'default')
。
要捕获空字符串,请搜索
^\s*$
。 regexp_replace(thing, '^\s*$', 'default')
。
我们像这样把它们放在一起......
select
coalesce(regexp_replace(thing, '^\s*$', 'default'), 'default')
from test;
如果
thing
是null
,regexp_replace
将返回null
,coalesce
将返回'default'
。
如果
thing
为空或空白,regexp_replace
将返回 default
,coalesce
将返回 default
。
如果
thing
不是其中之一,regexp_replace
将返回 thing
并且 coalesce
将返回 thing
。
另一种可能更容易理解的选择是:
select
case
when trim(word) = '' then 'default'
else coalesce(word, 'default')
end
from test
如果您愿意,您可以将其放入函数中。我们可以声明它
immutable
(相同的参数总是产生相同的结果)可能会提高性能。
create function replace_blanks(text, text) returns text
immutable
as $$
select coalesce(regexp_replace($1, '^\s*$', $2), $2)
$$ language sql;
select replace_blanks(word, 'default') from test;
PostgreSQL 中的演示。 Redshift 源自 PostgreSQL,因此它的工作原理应该相同。