【发布时间】:2018-12-24 05:38:44
【问题描述】:
假设我有一个包含几个值的表设置,包括名称、ID 和 引用另一个表的 ID 的外键。名称可以为空。
当我从这个表中选择所有记录时,如果它不为空,我想获取名称。 如果是,我想获取外键引用的记录的名称。 外键引用的记录的名称也可能为空。
我有哪些选择?
ISNULL 和 COALESCE 哪个更好?
【问题讨论】:
假设我有一个包含几个值的表设置,包括名称、ID 和 引用另一个表的 ID 的外键。名称可以为空。
当我从这个表中选择所有记录时,如果它不为空,我想获取名称。 如果是,我想获取外键引用的记录的名称。 外键引用的记录的名称也可能为空。
我有哪些选择?
ISNULL 和 COALESCE 哪个更好?
【问题讨论】:
您可以使用其中任何一个(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;
【讨论】:
您也可以尝试使用 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
【讨论】:
使用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
【讨论】: