web-dev-qa-db-fra.com

SQL Select Return Default Value If Null

Base de données: 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)))

Le problème est que j'ai plusieurs "listes" sans image, et à cause de ce script SQL, elles n'apparaissent pas. Comment puis-je les faire apparaître?

Peut-être donner à la colonne Pictures.Picture une valeur de "default.jpg" si la valeur est nulle? Je suis assez perdu là-dessus, donc si quelqu'un pouvait aider, ce serait incroyable. Désolé si je pose mal la question également, je ne comprends pas comment demander vraiment ce dont j'ai besoin. Mais demandez plus de détails et je les posterai.

Chaque annonce peut avoir autant d'images que l'utilisateur le souhaite, j'ai besoin de ce script pour afficher une annonce même si elle n'a pas d'image.


PHASE 2


Merci à tous. Jusqu'à présent, j'apprends de nouvelles commandes dont je ne savais même pas qu'elles existaient. Le problème est maintenant de renvoyer une ligne pour chaque image d'une annonce. Mais l'image par défaut fonctionne très bien.

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

Comment puis-je l'obtenir pour qu'il ne renvoie qu'une ligne par ListingID?

29
Landmine

Deux choses:

  1. Utilisation left outer join au lieu de inner join pour obtenir toutes les annonces, même avec des images manquantes.
  2. Utilisez coalesce pour appliquer la valeur par défaut

    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 
    

MODIFIER Pour limiter à une ligne:

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))) 
41

si vous souhaitez définir la valeur par défaut si le pic est nul, vous pouvez le faire via la clé COALESCE Word:

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

Vous pouvez également y parvenir via IsNull comme ci-dessous:

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

vous pouvez lire ici sur IsNull et Coalesce

10
Vijjendra

Utilisez left outer join Au lieu de inner join

Inner join Renverra des résultats si et seulement s'il y a un résultat qui satisfait la jointure.

Left outer join Renverra les résultats de la table latérale gauche, et si la jointure est satisfaite, ajoutez également les résultats de la table latérale droite ..

Si vous devez convertir les valeurs nulles renvoyées par les jointures non satisfaisantes, utilisez la fonction coalesce comme coalesce(Pictures.Picture, 'default.jpg')

4

Besoin de faire une jointure GAUCHE

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

Landmine, quelle base de données utilisez-vous?

Si c'est SQL Server 2005 ou supérieur ou Oracle, vous pouvez utiliser la commande pivot pour y parvenir.

1
clyc