2011-11-09 48 views
0

我有这个头脑简单的查询:处理空字符串时,串联Select语句

select a.str_number+' '+a.str_name+' '+a.str_suffix+' '+a.str_apt AS addr from mytable 

此查询工作,只要没有连接值是不是NULL。如果有任何为空,则地址不显示。

我尝试这样做:

select IsNULL(a.str_number+' '+a.str_name+' '+a.str_suffix+' '+a.str_apt AS addr,'') from table 

我想做到的是用空白空间来代替NULL值是否为空,但我仍然得到任何值。

回答

0

使用COALESCE:

select a.str_number+' '+a.str_name+' '+COALESCE(a.str_suffix, '')+' '+a.str_apt AS addr from mytable 
+0

是啊,那其实就是我已经决定这样做,但我担心的是,它是否是最好使用COALESCE批发喜欢你了,或做单独如:

select COALESCE(a.str_number,'')+' '+COALESCE(a.str_name,'')+' '+COALESCE(a.str_suffix, '')+' '+COALESCE(a.str_apt,'') AS addr from mytable
。这种方法有多昂贵? –

1

这是泰德Codd的规则,关系数据库的结果。 As applied to MS SQL

理想情况下,任何使用NULL的操作都应该导致NULL。尽管过去有一些问题,由于某些SQLServer选项的存在决定了NULL是如何处理的(而不是以“确定的”方式处理它)。

  • ANSI_NULLS:如果OFF,则NULL = NULL为True用于比较。如果ON(默认),NULL = NULL返回UNKNOWN(理想情况)。

  • CONCAT_NULL_YIELDS_NULL:如果ON,空值被视为理想的方式。例如NULL + < numValue> = NULL。如果OFF,空值被以非标准方式使得NULL + <值> = <值>处理。 (做了按BOL的向后兼容性,这说明了一切)

空的基本意思是这样的:我们不知道这个值,所以我们不应该曾经尝试使用它。我相信SQL区分null和一个空字符串,所以我会存储一个空字符串“”,如果这是我以后想要在串联中使用。

+0

OK,谢谢主席先生,但我怎么解决这个呢? –

+1

'ISNULL'其可以包含一个空值和连接结果的每一列。 –

1
SELECT 
ISNULL(a.str_number,'') + ' ' + 
ISNULL(a.str_name,'') + ' ' + 
ISNULL(a.str_suffix,'') + ' ' + 
ISNULL(a.str_apt,'') 
AS addr 
FROM mytable 

非常难看,但应该这样做。