2011-11-15 3 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 to 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 
        ) ;