假设我有一个表设置,其中包含一些值,包括名称,ID和 引用另一个表的ID的外键。名称可以为空。
当我从该表中选择所有记录时,如果名称不为空,我想获取名称。 如果是这样,我想获取外键引用的记录的名称。 外键引用的记录的名称也可能为空。
我有什么选择?
ISNULL和COALESCE之间哪个更好?
答案 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
名称值来说明空值。对于COALESCE
与ISNULL
而言,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