SQL Выберите Возвращаемое значение по умолчанию, если ноль - PullRequest
28 голосов
/ 08 октября 2010

База данных: 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 они не отображаются.Как я могу заставить их отображаться?

Может быть, дать столбцу Pictures.Picture значение "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

Как его получить, чтобы оно возвращало только 1 строку на ListingID?

Ответы [ 5 ]

40 голосов
/ 08 октября 2010

Две вещи:

  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))) 
10 голосов
/ 08 октября 2010

Если вы хотите установить значение по умолчанию, если 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)))

Вы можете прочитать здесь о IsNull и Coalesce

4 голосов
/ 08 октября 2010

Использование left outer join вместо inner join

Inner join вернет результаты, если и только если найдется результат, удовлетворяющий объединению.

Left outer join вернет результаты избоковую таблицу left и, если соединение выполнено, также добавьте результаты из боковой таблицы right .

Если вам нужно преобразовать нулевые значения, возвращаемые из неудовлетворительные объединения, затем используйте функцию coalesce, например coalesce(Pictures.Picture, 'default.jpg')

2 голосов
/ 08 октября 2010

Нужно сделать ЛЕВОЕ соединение

SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID 
FROM Listing LEFT JOIN Pictures ON Listing.ID = Pictures.ListingID
1 голос
/ 08 октября 2010

Landmine, какую базу данных вы используете?

Если это sql server 2005 или выше или oracle, вы можете использовать команду pivot для достижения этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...