2011-11-15 4 views
1

クエリを検索する際に、何か探しているものが見つからないときに、デフォルト値を返すようにするにはどうすればよいですか?次のクエリでは例えばnull戻り値の設定を避ける

、:

SELECT 
      food_id, 
      drink_id, 
      payment_amount, 
      count(*) AS total_payments, 
      payment_amount * count(*) AS total_benefit 
      FROM foods pc 
      INNER JOIN drinks px 
      ON pc.id = px.food_id 
      AND pc.drink_id = 25 
      GROUP BY food_id, drink_id; 

pc.idは私が空のセットを取得px.food_idと同じではありません。私は何かを探しています:

SELECT 
      food_id DEFAULT IF NOTHING 5, 
      drink_id DEFAULT IF NOTHING 25, 
      payment_amount DEFAULT IF NOTHING 0, 
      count(*) AS total_payments DEFAULT IF NOTHING 0, 
      payment_amount * count(*) AS total_benefit DEFAULT 0 
      FROM foods pc 
      INNER JOIN drinks px 
      ON pc.id = px.food_id 
      AND pc.drink_id = 25 
      GROUP BY food_id, drink_id; 

上記のような何か方法はありますか?

答えて

1

あなたはおそらくCOALESCEをしたい:

SELECT 
      COALESCE(food_id, 0) AS food_id, 
      COALESCE(drink_id, 25) AS drink_id, 
      COALESCE(payment_amount, 0) as payment_amount, 
      count(*) AS total_payment, 
      COALESCE(payment_amount, 0) * count(*) AS total_benefit 
      ... 
GROUP BY COALESCE(food_id, 0), COALESCE(drink_id, 25), 
     COALESCE(payment_amount, 0); 

など

+0

出力フィールド内のNULLを含む結果セットがある場合にのみ動作します。空の結果セットを補うことはできません。 – MatBailie

+0

@Dems D'oh、はい、それを逃しました。 +1をTevoに送る。 – Rup

3

あなたがあるため、内部の空の結果セットを取得している参加します。これはおそらく外部結合であるべきです。 Rupのの答えでこれを組み合わせることで、あなたが探しているものはおそらくです:

SELECT 
     COALESCE(food_id, 0) AS food_id, 
     COALESCE(drink_id, 25) AS drink_id, 
     COALESCE(payment_amount, 0) as payment_amount, 
     count(*) AS total_payment, 
     COALESCE(payment_amount, 0) * count(*) AS total_benefit 
     FROM foods pc 
     LEFT OUTER JOIN drinks px 
     ON pc.id = px.food_id 
     AND pc.drink_id = 25 
     GROUP BY food_id, drink_id; 
+0

これは指定された飲み物に関連付けられていなくても、常にすべての食品を返します。 OPが何を望んでいるかはわからないので、OPが明確になるまで+1してください:) – MatBailie

0
SELECT food_id, drink_id, payment_amount, COUNT(*) AS total_payments, 
     payment_amount * COUNT(*) AS total_benefit 
    FROM foods pc 
     INNER JOIN drinks px 
     ON pc.id = px.food_id 
      AND pc.drink_id = 25 
    GROUP BY food_id, drink_id 
UNION 
SELECT 0, 0, 0, 0, 0 
    FROM MySystemTableAlwaysHasExactlyOneRow 
    WHERE NOT EXISTS (
        SELECT * 
         FROM foods pc 
         INNER JOIN drinks px 
          ON pc.id = px.food_id 
           AND pc.drink_id = 25 
        ) ; 
関連する問題