2015-02-10 42 views
1

从任两列中选择在SQL Server 2008R2我有两个表,CONFIG_DATACNA_LIST在SELECT

CONFIG_DATA有两个字段:

ID [varchar(20)] Address [int] 
01     141516 
02     132132 

CNA_LIST有三个字段:

Address [int] IP1 [varchar(20)] IP2 [varchar(20)] 
141516   1.2.3.4    (null) 
132132   (null)    2.3.4.5 

这些是具有一个或两个IP地址的现场设备,在IP1IP2字段(可以是,或者两者都有)。

我想与IP1CNA_LIST表列出CONFIG_DATA表,如果它是NULL,该IP2

Address字段链接两个表。

这将很好地工作:

select a.ID, a.Address, b.IP1 
from CONFIG_DATA a, CNA_LIST b where a.Address = b.Address 

但如果IP1null我需要IP2,与此列中列出的"IP"

我已经试过IF(b.IP1 <> '')b.IP1 ELSE b.IP2但语法检查器抱怨。

+0

'CASE WHEN THEN WHEN THEN 。 .. ELSE END AS ' – RLH 2015-02-10 18:29:25

+0

[踢坏的习惯:使用旧式JOIN](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick- using-old-style-joins.aspx) - 在ANSI-** 92 ** SQL标准中,旧式*逗号分隔的表*样式列表已替换为* proper * ANSI'JOIN'语法超过20年**),其使用是不鼓励 – 2015-02-10 21:41:45

回答

8

您可以使用该isnull()coalesce()功能做到这一点:

select a.ID, a.Address, isnull(b.IP1, b.IP2) as "IP" 
from CONFIG_DATA a 
inner join CNA_LIST b on a.Address = b.Address 

我也改写查询中使用明确连接,而不是旧的隐式连接语法。

isnull()采用两个参数(检查,更换),并且如果所述第一是NULL返回第二。
coalesce()以几乎相同的方式工作,但可以采用两个以上的参数,并返回第一个非NULL参数或NULL,如果所有参数均为NULL

还有一种不依赖于内置的功能,这是TI使用case表达这样的第三种方式:case when b.IP1 is not null then b.IP1 else b.IP2 end

+0

谢谢 - 完美的工作。 – user3235770 2015-02-10 18:48:28

+0

我会建议在这两个字段中加入nullif()来解释空白,除非你完全确定缺少的值是NULL。 ISNULL(NULLIF(b.IP1, ''),NULLIF(b.IP2)) – rwking 2015-02-10 18:59:00