2011-11-15 95 views
1

如何使查询始终返回一些东西,当它找不到我正在查找的内容时的默认值?避免空返回集

例如,在下面的查询:

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

这如果有一个结果集,它包含了输出字段空值才有效。它将无法补偿空的结果集。 – 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的要求,所以+1直到OP澄清:) – 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 
        ) ;