Избежание нулевого набора возврата - PullRequest
1 голос
/ 15 ноября 2011

Как сделать так, чтобы запрос всегда возвращал что-то, значение по умолчанию, когда он не находит то, что я ищу?

Например, в следующем запросе:

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;

Есть ли способы сделать что-то подобное выше?

Ответы [ 3 ]

3 голосов
/ 15 ноября 2011

Вы получаете пустой набор результатов из-за внутреннего соединения. Это должно быть внешнее соединение. Комбинируя это с ответом Рупа, вероятно, вы ищете:

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;
1 голос
/ 15 ноября 2011

Вы, вероятно, хотите 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 голосов
/ 16 ноября 2011
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
                     ) ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...