2013-06-21 72 views
9

内NULL和空字符串我有可以有NULL或空的空间(即'')值的列。我想用'UNKNOWN'这样的有效值替换这两个值。我发现的各种解决方案都建议修改表格本身的值。但是,在这种情况下,这不是一个选项,因为数据库是针对开发和/或打补丁的第三方应用程序很差的(实际上我认为我的罗威纳可以做得更好)。我担心修改基础数据可能会导致应用程序陷入吸烟漏洞。更换Select语句

我已经尝试下面的命令的变化:

COALESCE(Address.COUNTRY, 'United States') -- Won't replace empty string as it is not NULL 
REPLACE(Address.COUNTRY, '', 'United States') -- Doesn't replace empty string 
ISNULL(Address.COUNTRY, 'United States') -- Works for NULL but not empty string 

我知道我可以使用CASE声明,但我希望是一个更优雅/有效的解决方案。

你得相信我,当我说我已经找了一个解决我的具体问题,并没有找到答案。但是,如果我忽略了某些东西,请向我展示点亮的路径。

回答

46

试试这个

COALESCE(NULLIF(Address.COUNTRY,''), 'United States') 
+1

这似乎已经做到了。啤酒对我来说。然而,我很惊讶,它的工作原理在于我的理解是COALESCE函数将获取第一个非空值。在声明中,我希望它会返回空格而不是文本字符串?但是,底线,感谢您的解决方案。 – mbadtk

+4

这个语句中有两个函数,一个是NULLIF,它将空字符串转换为空,然后是'coalesce',用于检查空 –

+0

@rs:注意:nullif不会将空字符串转换为空,它会返回如果两个参数相同,则为null;)。 –

5

听起来像是你想有一个观点,而不是改变实际的表数据。

Coalesce(NullIf(rtrim(Address.Country),''),'United States') 

这将迫使你的专栏为空,如果它实际上是一个空字符串(或空字符串),然后聚结将有一个空的工作。

+1

有'ltrim'和'rtrim'似乎没用?如果它是空的(空格除外),它从任一侧都是空的;) – Wolph

+1

@WoLpH aye,非常真实。我删除了一个。 (我想我只是习惯写两个) – Brad

+1

创建一个视图并没有超出我的想法,尽管它可能应该有。 rs和你的变体提供了一个适当的解决方案,所以不需要查看。 – mbadtk