【问题标题】:SQL Select Return Default Value If NullSQL 选择返回默认值如果为空
【发布时间】:2011-04-22 15:05:42
【问题描述】:

数据库:MS SQL 2008

SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID 
FROM Listing INNER JOIN Pictures ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID) FROM Pictures WHERE (ListingID = Listing.ID)))

问题是,我有几个没有图片的“列表”,并且由于这个 SQL 脚本,它们没有显示出来。我怎样才能让他们出现?

如果值为 null,也许给 Pictures.Picture 列一个值“default.jpg”?我对此很迷茫,所以如果有人可以提供帮助,那就太棒了。对不起,如果我问的问题也很糟糕,我不明白如何真正问我需要它做什么。但是请询问更多详细信息,我会发布它们。

每个Listing可以有用户想要的任意数量的图片,我需要这个脚本来显示一个Listing,即使它没有图片。


第 2 阶段


谢谢大家。到目前为止,我正在学习一些我什至不知道存在的新命令。现在的问题是它为列表中的每张图片返回一行。但默认图像效果很好。

SELECT Listing.Title, Listing.MLS, coalesce(Pictures.PictureTH, '../default_th.jpg') as PictureTH, coalesce(Pictures.Picture, '../default.jpg') as Picture, Listing.ID FROM Listing LEFT
OUTER JOIN Pictures ON Listing.ID = Pictures.ListingID

我怎样才能得到它,以便每个 ListingID 只返回 1 行?

【问题讨论】:

  • 您是否尝试过使用原始查询的WHERE 部分?
  • 我有,但它不起作用。如果人们想尝试自己的一些陈述,我会发布服务器信息?我将创建一个新的虚拟数据库。

标签: sql sql-server select


【解决方案1】:

两件事:

  1. 使用left outer join 而不是inner join 来获取所有列表,即使缺少图片。
  2. 使用coalesce 应用默认值

    SELECT Listing.Title
        , Listing.MLS
        , Pictures.PictureTH
        , coalesce(Pictures.Picture, 'default.jpg') as Picture
        , Listing.ID  
    FROM Listing 
    LEFT OUTER JOIN Pictures 
        ON Listing.ID = Pictures.ListingID 
    

编辑限制为一行:

SELECT Listing.Title
    , Listing.MLS
    , Pictures.PictureTH
    , coalesce(Pictures.Picture, 'default.jpg') as Picture
    , Listing.ID  
FROM Listing 
LEFT OUTER JOIN Pictures 
    ON Listing.ID = Pictures.ListingID 
WHERE Pictures.ID is null
OR Pictures.ID = (SELECT MIN(ID) 
    FROM Pictures 
    WHERE (ListingID = Listing.ID))) 

【讨论】:

  • 但是我该如何做才能让每个列表只返回 1 行,而不是像图片一样多的行?
  • 如果有不止一张图片,但您只希望返回一行,那么使用哪张图片的规则是什么?
  • 抱歉,在原始查询中没有看到 where 子句。补充说,测试包括没有匹配图片的行。
【解决方案2】:

如果你想在 Pic 为 null 的情况下设置默认值,你可以通过 COALESCE 关键字来做到这一点:

SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, 
COALESCE (Pictures.Picture, 'default.jpg') AS Pictures, Listing.ID 
FROM Listing LEFT JOIN Pictures 
ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID) 
FROM Pictures WHERE (ListingID = Listing.ID)))

您也可以通过 IsNull 实现这一点,如下所示:

SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, 
ISNULL(Pictures.Picture, 'default.jpg') AS Pictures, Listing.ID 
FROM Listing LEFT JOIN Pictures 
ON Listing.ID = Pictures.ListingID
WHERE (Pictures.ID = (SELECT MIN(ID) 
FROM Pictures WHERE (ListingID = Listing.ID)))

您可以阅读 here 关于 IsNull 和 Coalesce

【讨论】:

    【解决方案3】:

    使用left outer join 代替inner join

    Inner join 将返回结果当且仅当存在满足连接的结果。

    Left outer join 将返回 left 侧表的结果,如果满足连接,还添加 右侧 侧表的结果..

    如果您需要转换从非满足连接返回的空值,则使用coalesce函数,如coalesce(Pictures.Picture, 'default.jpg')

    【讨论】:

      【解决方案4】:

      需要进行左连接

      SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID 
      FROM Listing LEFT JOIN Pictures ON Listing.ID = Pictures.ListingID
      

      【讨论】:

      • 有效,但也为每张图片返回一行。所以它给了我 7 个结果,因为清单 1 上有 6 张图片,清单 2 没有图片,但是被返回了。
      【解决方案5】:

      Landmine,你用的是什么数据库?

      如果是sql server 2005以上或者oracle,可以使用pivot命令来实现。

      【讨论】:

      • MSSQL 2008,我也会在顶部发布该信息。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多