Мне нужно было обновить тестовый сервер и добавить файлы, измененные с версии 2.1. Для меня работало аналогичное решение, как James Ehly, но в моем случае я хотел экспортировать в архив пакет разницы между двумя старыми тегами - tag_ver_2.1 и tag_ver_2.2, а не только один.
Например: tag_ver_2.1 = 1f72b38ad
tag_ver_2.2 = c1a546782
Здесь приведен пример:
git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar
Вам просто нужно добавить вторую часть первого условия JOIN
(or a.field1='abc' or a.field1='def'
) к первой части (a.field1 = b.field1
), обусловленной b.field1 = 123
, т.е.
inner join b on (a.field1 = b.field1 or b.field1 = 123 and (a.field1='abc' or a.field1='def'))
Как правило, вы можете переписать любую условную логику if / conditional с осторожным использованием AND, хотя при этом производительность может пострадать.
ON (b.field1 = 123 AND (first conditions))
OR (b.field1 <> 123 AND (second conditions))
Как уже было сказано выше, производительность может пострадать (производительность MySQL, в частности, использование индекса, относительно низкая, если используется OR); поэтому альтернативой является использование UNION (который по-прежнему представляет собой один запрос, даже если он более подробный и полубрезервированный):
select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1 or a.field1='abc' or a.field1='def')
where b.field1 = 123 and a.field2 = 'W'
UNION ALL
select a.field1, a.field2, a.field3, b.field1, b.field2, b.field3
from a
inner join b on (a.field1 = b.field1)
where b.field1 = 234 and a.field2 = 'W'.