SQL Server 2014-如果列为空,则从另一个表中检索值

时间:2018-12-24 05:38:44

标签: select sql-server-2014

假设我有一个表设置,其中包含一些值,包括名称,ID和 引用另一个表的ID的外键。名称可以为空。

当我从该表中选择所有记录时,如果名称不为空,我想获取名称。 如果是这样,我想获取外键引用的记录的名称。 外键引用的记录的名称也可能为空。

我有什么选择?

ISNULL和COALESCE之间哪个更好?

3 个答案:

答案 0 :(得分:0)

您可以使用它们之一(ISNULL或COLLASCE)。

SELECT ISNULL(t1.name, (SELECT ISNULL(t2.name,"") FROM Table2 t2 WHERE ID=t1.my_foreign_id)) AS "name" FROM Table1 t1;  

SELECT COLLASCE(t1.name, (SELECT COLLASCE(t2.name,"") FROM Table2 t2 WHERE ID=t1.my_foreign_id)) AS "name" FROM Table1 t1;  

答案 1 :(得分:0)

您也可以尝试使用CASE WHEN。

select case when t1.name is not null  then t1.name 
else 
     case when (select t2.name FROM Table2 t2 WHERE ID=t1.my_foreign_id ) is not null 
     then (select t2.name FROM Table2 t2 WHERE ID=t1.my_foreign_id ) else '' end 
end 
from  Table1 t1

答案 2 :(得分:0)

使用LEFT JOIN,然后使用COALESCE名称值来说明空值。对于COALESCEISNULL而言,COALESCE是ANSI标准的一部分,这使其可以在其他RDBMS(如Oracle和DB2)中移植。您提到两个表中的名称列都可能为空。如果要替换其他值,COALESCE将允许这样做,而ISNULL仅接受两个参数。结果的数据类型在两个函数之间也不同,ISNULL使用与第一个参数相同的数据类型,而COALESCE将使用优先级最高的数据类型。请记住,如果尝试将优先级较低的数据类型隐式转换为优先级较高的数据类型,则可能导致转换错误。一个常见的示例是尝试将VARCHAR / NVARCHAR类型转换为数字类型。可以按here找到按优先级排列的数据类型列表。

SELECT 
FT.ID,
COALESCE(FT.Name, PT.Name, 'Name Not Listed') as Name
FROM DBO.TableWithFK FT
LEFT JOIN DBO.TableWithPK PT on FT.ID = PT.ID