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

时间:2010-10-07 22:27:36

标签: 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)))

问题是,我有几个没有图片的“列表”,并且因为这个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

我怎样才能获得它,因此每个ListingID只返回1行?

5 个答案:

答案 0 :(得分:39)

两件事:

  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 
    
  3. 编辑限制为一行:

    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 :(得分:8)

如果您想设置默认值,如果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)))

您可以阅读有关IsNull和Coalesce的here

答案 2 :(得分:4)

使用left outer join代替inner join

当且仅当结果满足连接时,

Inner join才会返回结果。

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

如果您需要转换从不满意联接返回的空值,请使用coalesce函数coalesce(Pictures.Picture, 'default.jpg')

答案 3 :(得分:2)

需要进行LEFT加入

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

答案 4 :(得分:1)

Landmine,你在使用什么数据库?

如果是sql server 2005或更高版本或oracle,您可以使用pivot命令来实现此目的。