【问题标题】:Left Join Where Clause - How to return a default value when nullLeft Join Where 子句 - 如何在 null 时返回默认值
【发布时间】:2015-03-18 02:57:27
【问题描述】:

我试图在没有返回结果时获取默认值。我使用的示例是我将表 1 连接到表 2,其中用户 ID = 1。如您所见,表 2 中没有照片。

我希望它返回 No Photo Found,而不是在 sql server 中返回任何内容。

这是我正在使用的代码,但它不返回默认值。

SELECT 
  ISNULL(photoName, 'No Photos Found') as photoName 
FROM usertable
LEFT OUTER JOIN
phototable
ON
usertable.id= phototable.id
WHERE userID = 1

用户表

Id | User
0  | Jack

照片桌

ID | Photo
0  | me.jpg

【问题讨论】:

    标签: sql-server default


    【解决方案1】:

    您粘贴的查询中有一个小错误:

    as (photoName
    

    应该是:

    as photoName
    
    SELECT 
      ISNULL(photoName, 'No Photos Found') as photoName, 
    FROM usertable
    LEFT OUTER JOIN
    phototable
    ON
    usertable.id= phototable.id
    WHERE userID = 1;
    

    除了您的代码看起来不错之外,您是否有真实数据而不是您发布的数据,因为这很可能是数据/架构问题。

    例如,在您的示例数据中,您调用列 photo 而不是 photoname。

    【讨论】:

    • 对不起,我犯了一点错误。因此,可以说两个表都没有连接参考。我修改了示例,并从用户表中取出了 id 为 1 的引用。如果找不到匹配项,例如没有 1 的用户 ID,我如何获得默认结果?
    • 如果根本没有匹配项(userId=1 根本不存在),则不返回任何记录,因此答案为否。
    【解决方案2】:

    我会使用coalesce():

    SELECT coalesce(p.photoName, 'No Photos Found') as photoName
    FROM usertable u LEFT OUTER JOIN
         phototable p
         ON u.id = p.id
    WHERE u.userID = 1
    

    【讨论】:

    • 只是出于好奇,为什么 COALESCE 超过 ISNULL,当只有两个参数时(除了它是标准的一部分,而 ISNULL 不是) - 知道 COALESCE 只不过是凯斯,带着所有的行李?
    • coalesce() 是 ANSI 标准,因此几乎所有数据库都支持它,当其他选项基本相同时,我倾向于使用标准功能。 isnull() 在第一个参数很复杂(例如子查询)时确实有性能优势,所以我会使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2014-05-25
    • 1970-01-01
    相关资源
    最近更新 更多