sql - 从 SELECT 中的两列之一中选择

标签 sql sql-server select if-statement

在 SQL Server 2008R2 中,我有两个表,CONFIG_DATACNA_LIST :
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 地址的现场设备,位于 IP1 中。或 IP2字段(可以是其中之一,也可以是两者)。

我想列出CONFIG_DATA表带 IP1来自 CNA_LIST表,如果是 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但语法检查器提示。

最佳答案

您可以使用 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 .

还有第三种不依赖于内置函数的方法,那就是使用 case像这样的表达:case when b.IP1 is not null then b.IP1 else b.IP2 end

关于sql - 从 SELECT 中的两列之一中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28438988/

相关文章:

sql - 合并与更新插入

sql - SQLCMD 模式下的 SSMS - 语法不正确

mysql - 为什么这个带有嵌套WHERE 子查询的SELECT 语句在MYSQL 中运行缓慢?

MySQL - 是否可以根据另一个表中数据的存在对一个表中的数据进行排序?

mysql - 使用 sql distinct 从两个不同的数据库表中检索相同的列

mysql - sql 查询来计算标记帖子的数量

mysql - 如何将 postgresql 查询转换为 mysql 查询

php - 从sql server日期时间中获取日期

php - Mysql Select,Where 语法从许多表中回显结果

sql - 如何将 XML 数据转换为 SQL Server 表