2011-09-27 68 views
2

我有地址列,即使只有一个字段不为空,我想连接。tsql帮助连接几个字段

例如

street,city,state,zip 
null,null,AL,36609 

目前,我的sql语句是这样的:

select street + ',' + city + ',' + state + ',' + 'zip as address 

所以上面的示例记录给我空的地址。有没有简单的方法来显示什么不是nulll?

所以上面的例子中记录将返回:

AL, 36609 

回答

1

尝试此查询:

SELECT SUBSTRING(
    ISNULL(','+street,'') 
    +ISNULL(','+city,'') 
    +ISNULL(','+state,'') 
    +ISNULL(','+zip,'') 
    ,2, 500) AS address 
FROM table 
1

您可以使用COALESCE

SELECT 
    COALESCE (street, '') + 
    COALESCE (city, '') + 
    state + 
    zip AS address 

另一种方法是使用ISNULL

SELECT 
    ISNULL(street, '') + 
    ISNULL(city, '') + 
    state + 
    zip AS address 
+0

@ p.campbell - 很对。我假设从'',''到'+'的飞跃太多了......答案已更新。 – Oded

4

试试这个:

select 
    isnull(street + ',', '') + 
    isnull(city + ',', '') + 
    isnull(state + ',', '') + 
    isnull(zip + ',', '') 

这依赖于NULL上的任何操作返回NULL的标准NULL行为。如果street为NULL,那么street +','将返回NULL。 ISNULL运算符将选择空字符串。

有关空串联的更多信息,请参见SET CONCAT_NULL_YIELDS_NULL。 (此选项将永远在未来的版本中启用。)

0
declare @temp table (street varchar(100) null,city varchar(100) null, state char(2) null, zip varchar(10) null) 
insert into @temp (street,city,state,zip) values (null,null,'AL','36609') 

select ISNULL(street + ', ','') + ISNULL(city + ', ','') + ISNULL(state + ', ','') + ISNULL(zip,'') from @temp 

将返回

AL, 36609 

编辑

这是不漂亮,但似乎对各种工作null展示位置:

declare @temp table (street varchar(100) null,city varchar(100) null, state char(2) null, zip varchar(10) null) 
insert into @temp (street,city,state,zip) values (null,null,'AL','36609') 
insert into @temp (street,city,state,zip) values (null,null,'AL',null) 
insert into @temp (street,city,state,zip) values ('Acacia Avenue',null,'AL',null) 
insert into @temp (street,city,state,zip) values ('Acacia Avenue',null,null,null) 

select 
    case 
    when city is null and state is null and zip is null then ISNULL(street, '') 
    when state is null and zip is null then ISNULL(street + ', ','') + ISNULL(city,'') 
    when zip is null then ISNULL(street + ', ','') + ISNULL(city + ', ','') + ISNULL(state,'') 
    else ISNULL(street + ', ','') + ISNULL(city + ', ','') + ISNULL(state + ', ','') + ISNULL(zip,'') 
end 
from @temp 

成绩

AL, 36609 
AL 
Acacia Avenue, AL 
Acacia Avenue 

(4 row(s) affected) 
+1

如果我只有状态,或除zip之外的任何字段,我会得到“AL”,即尾随逗号。无论如何围绕? – Rod

+0

好点,你可以使用级联案例陈述 - 这将是丑陋的我会敲一个 – amelvin

+0

@rod,我刚做的编辑应该做你所要求的 – amelvin

0

我会写如下:

DECLARE @Address VARCHAR(200) 
select @Address= isnull(',' + street, '') + isnull(',' + city, '') + 
isnull(',' + state,  '') + isnull(',' + zip, '') from yourtablename where criteria 
SELECT STUFF(@Address, 1, 1, '') AS Address 

前面已经指出的其他成员,当你执行任何操作字段具有NULL,结果表达式(值)将始终为空。