web-dev-qa-db-ja.com

NULLの場合、SQL Selectはデフォルト値を返します

データベース: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スクリプトのために表示されないことです。どうすればそれらを表示できますか?

値がnullの場合、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

リストIDごとに1行しか返さないようにするにはどうすればよいですか?

29
Landmine

2つのこと:

  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 
    

[〜#〜] edit [〜#〜] 1行に制限するには:

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

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について読むことができます

10
Vijjendra

_left outer join_の代わりに_inner join_を使用します

_Inner join_は、結合を満たす結果がある場合にのみ結果を返します。

_Left outer join_はleftサイドテーブルから結果を返し、結合が満たされる場合はrightサイドテーブルからも結果を追加します。

non-satisfying結合から返されたnull値を変換する必要がある場合は、coalesce(Pictures.Picture, 'default.jpg')のようなcoalesce関数を使用します

4

左結合を行う必要があります

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

地雷、どのデータベースを使用していますか?

SQL Server 2005以降またはOracleの場合、pivotコマンドを使用してこれを実現できます。

1
clyc