SQL Select Возвращаемое значение по умолчанию Если Null
База данных: 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 script они не отображаются. Как я могу заставить их появиться?
Может быть, дать Picture.Picture Column значение "default.jpg", если значение равно null? Я довольно потерял это, поэтому, если кто-то может помочь, это будет потрясающе. Извините, если я тоже задаю этот вопрос плохо, я не понимаю, как правильно спросить, что мне нужно. Но попросите более подробную информацию, и я отправлю их.
В каждом листинге может быть столько фотографий, сколько захочет пользователь, мне нужен этот script, чтобы отображать листинг, даже если у него нет изображения.
ФАЗА 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 строку в листинг ID?
Ответы
Ответ 1
Две вещи:
- Используйте
left outer join
вместо inner join
, чтобы получить все списки, даже с отсутствующими изображениями.
-
Используйте 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
EDIT Чтобы ограничить одну строку:
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)))
Ответ 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)))
вы можете прочитать здесь об IsNull и Coalesce
Ответ 3
Используйте left outer join
вместо inner join
inner join
будет возвращать результаты тогда и только тогда, когда есть результат, который удовлетворяет соединению.
left outer join
вернет результаты из левой таблицы, и если соединение выполнено, также добавьте результаты из таблицы справа.
Если вам нужно преобразовать нулевые значения, возвращаемые из неудовлетворительных объединений, используйте функцию coalesce
, например coalesce(Pictures.Picture, 'default.jpg')
Ответ 4
Нужно сделать LEFT join
SELECT Listing.Title, Listing.MLS, Pictures.PictureTH, Pictures.Picture, Listing.ID
FROM Listing LEFT JOIN Pictures ON Listing.ID = Pictures.ListingID
Ответ 5
Landmine, какую базу данных вы используете?
Если это sql server 2005 или выше или oracle, вы можете использовать команду pivot для достижения этого.