Как условно выбрать поле из одной из двух таблиц? - PullRequest
2 голосов
/ 15 апреля 2010

У меня есть две таблицы счетов и pending_payments, обе из которых имеют следующие общие строки: invoice_id и balance Я хочу сделать выбор в MySQL, который будет работать так:

[псевдокод]

if(invoice_id exists in pending_payments table) {
    select balance from pending_payments where invoice_id = yadayadayada
} else {
    select balance from invoices where invoice_id = yadayadayada
}

Это вообще выполнимо в MySQL? Если да, то как?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2010
select i.invoice_id, coalesce(pp.balance, i.balance) as Balance
from invoices i
left outer join pending_payments pp on i.invoice_id = pp.invoice_id

Дайте мне знать, если в pending_payments может быть несколько строк для одного и того же invoice_id, и я предложу альтернативное решение.

1 голос
/ 15 апреля 2010

Мне нравится решение OrbMan (я думаю, что оно наиболее интуитивное), но есть и другой способ - выбрать все из одной таблицы, а затем те, которые вы не выбрали из второй.

select invoice_id, balance from pending_payments where invoice_id = yadayadayada
UNION
select invoice_id, balance from invoices where invoice_id = yadayadayada
  AND invoice_id not in (select invoice_id from pending_payments)

и в качестве примечания некоторые утверждают, что в некоторых системах это на самом деле быстрее. Я не делаю таких заявлений, но если скорость - проблема, стоит попробовать.

Кроме того, если вам нужно включить исходный столбец (например, ожидающий обработки или счет-фактуру), это легко сделать следующим образом:

select 'pending' as source, invoice_id, balance from pending_payments where invoice_id = yadayadayada
UNION
select 'invoice' as source, invoice_id, balance from invoices where invoice_id = yadayadayada
  AND invoice_id not in (select invoice_id from pending_payments)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...