SQL选择返回默认值如果为空

Lan*_*ine 29 sql sql-server select

数据库: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)))
Run Code Online (Sandbox Code Playgroud)

问题是,我有几个没有图片的"列表",并且由于这个SQL脚本,它们没有出现.我怎样才能让它们出现?

如果值为null,可能会将Pictures.Picture Column的值设为"default.jpg"?我很遗憾,所以如果有人可以提供帮助,那就太棒了.对不起,如果我问的问题也很糟糕,我不明白如何真正地问我需要它做什么.但是要求更多细节,我会发布它们.

每个清单可以拥有用户想要的尽可能多的图片,我需要这个脚本来显示清单,即使它没有图片.


阶段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
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*nce 41

两件事情:

  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 
    
    Run Code Online (Sandbox Code Playgroud)

编辑限制为一行:

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))) 
Run Code Online (Sandbox Code Playgroud)


Vij*_*dra 10

如果你想设置默认值,如果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)))
Run Code Online (Sandbox Code Playgroud)

您也可以通过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)))
Run Code Online (Sandbox Code Playgroud)

你可以在这里阅读有关IsNull和Coalesce的信息