2010-10-07 102 views
23

数据库:MS SQL 2008SQL选择返回默认值如果空

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脚本,他们不露面。我如何让他们出现?

也许给Pictures.Picture列的值为“default.jpg”,如果该值为空?我对此很迷茫,所以如果有人能帮上忙,那会很棒。对不起,如果我问的问题不好,我不明白如何真正问我需要做什么。但要求更多细节,我会发布它们。

每个列表可以有多个用户想要的图片,即使它没有图片,我也需要该脚本来显示列表。


PHASE 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行?

+0

您是否尝试使用原始查询的WHERE部分? – 2010-10-07 23:00:20

+0

我有,它不起作用。如果有人想尝试一些自己的陈述,我会发布服务器信息?我将创建一个新的虚拟数据库。 – Landmine 2010-10-07 23:10:54

回答

34

两件事情:

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

    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))) 
+0

但是,我该如何做到这一点,所以它只返回每个列表1行,而不是有多少行有图片? – Landmine 2010-10-07 22:40:16

+0

如果存在多个图片但您只希望返回一行,那么使用哪张图片的规则是什么? – 2010-10-07 23:09:37

+0

对不起,没有看到原始查询中的where子句。补充说,通过一个测试来包含没有匹配图片的行。 – 2010-10-07 23:12:01

2

需要做一个LEFT JOIN

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

工程,但也为每张图片返回一行。所以它给了我7个结果,因为列表1上有6张图片,列表2没有图片,但是被返回。 – Landmine 2010-10-07 22:38:13

4

使用left outer join,而不是inner join

Inner join会返回结果当且仅当有满足连接的结果。

Left outer join会返回结果留下边桌,如果连接是满意也从边桌添加效果..

如果您需要将空值转换从返回非满足连接,然后使用​​3210功能像coalesce(Pictures.Picture, 'default.jpg')

8

,如果你想设置的默认值,如果PIC是空你可以通过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和凝聚

1

地雷,你使用的是什么数据库?

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

+0

MSSQL 2008,我会在顶部发布信息。 – Landmine 2010-10-07 22:58:03