【问题标题】:SQL Server 2014 - retrieve a value from another table if column is nullSQL Server 2014 - 如果列为空,则从另一个表中检索值
【发布时间】:2018-12-24 05:38:44
【问题描述】:

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

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

我有哪些选择?

ISNULL 和 COALESCE 哪个更好?

【问题讨论】:

标签: select sql-server-2014


【解决方案1】:

您可以使用其中任何一个(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;  

【讨论】:

    【解决方案2】:

    您也可以尝试使用 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
    

    【讨论】:

      【解决方案3】:

      使用LEFT JOIN 然后COALESCE 名称值来解释空值。至于COALESCEISNULLCOALESCE 是 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
      

      【讨论】:

        猜你喜欢
        • 2011-11-28
        • 2014-10-05
        • 1970-01-01
        • 2019-05-25
        • 2016-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多