2010-10-07 22 views
23

Base de datos: MS SQL 2008Select de SQL Volver valor predeterminado si Null

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

La cuestión es, tengo varios "Listados" sin una imagen, y debido a esta secuencia de comandos SQL que no aparecen . ¿Cómo puedo hacer que aparezcan?

Tal vez le dé a Pictures.Picture Column un valor de "default.jpg" si el valor es nulo? Estoy bastante perdido en esto, así que si alguien pudiera ayudar, sería increíble. Lo siento si hago la pregunta mal también, no entiendo cómo preguntar realmente lo que necesito hacer. Pero pide más detalles y los publicaré.

Cada lista puede tener tantas imágenes como desee el usuario, necesito esta secuencia de comandos para mostrar una lista incluso si no tiene una imagen.


FASE 2


Gracias a todos. Hasta ahora estoy aprendiendo algunos nuevos comandos que ni siquiera sabía que existían. El problema ahora es devolver una fila para cada imagen que tiene una lista. Pero la imagen predeterminada funciona muy 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 

¿Cómo puedo obtenerlo así que solo devuelve 1 fila por ListingID?

+0

¿Intentó con la parte 'DONDE' de su consulta original? –

+0

Tengo, y no funciona. Voy a publicar la información del servidor si la gente quiere probar algunas declaraciones propias? Crearé una nueva base de datos ficticia. – Landmine

Respuesta

34

Dos cosas:

  1. Use left outer join en lugar de inner join para obtener todos los listados, incluso con las imágenes que faltan.
  2. Uso coalesce para aplicar el valor por defecto

    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 
    

EDITAR Para limitar a una fila:

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

¿Pero cómo lo hago para que solo devuelva 1 fila por listado y no tantas filas como imágenes? – Landmine

+0

Si hay más de una imagen pero solo desea que se devuelva una, ¿cuáles son las reglas que debe usar la imagen? –

+0

Lo sentimos, no vimos la cláusula where en su consulta original. Se agregó eso, con una prueba para incluir filas donde no hay una Imagen que coincida. –

2

Es necesario hacer una combinación izquierda

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

Funciona, pero devuelve una fila para cada imagen también. Entonces me da 7 resultados porque hay 6 imágenes en el listado 1 y el listado 2 no tiene imágenes, pero se devuelve. – Landmine

4

Uso left outer join en lugar de inner join

Inner join obtendrá resultados si y sólo si hay un resultado que satisface la unión.

Left outer join proporcione resultados de la dejaron mesa auxiliar, y si la unión está satisfecho también se suman los resultados de la tabla del lado derecho ..

Si es necesario convertir los valores nulos devueltos desde el no satisface combinaciones, a continuación, utilizar la función como coalescecoalesce(Pictures.Picture, 'default.jpg')

8

si desea establecer el valor predeterminado si el PIC es nula usted puede hacerlo a través de la palabra clave 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))) 

También puede lograr esto a través de EsNulo, como a continuación:

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

se puede leer acerca here EsNulo y se unen

1

de Minas, lo que la base de datos está utilizando?

Si se trata de SQL Server 2005 o superior u Oracle, puede utilizar el comando pivote para lograrlo.

+0

MSSQL 2008, publicaré esa información en la parte superior también. – Landmine

Cuestiones relacionadas