Когато използвате case
, трябва да върнете само един запис - не повече от 1. За да постигна желания резултат, бих използвал ляво външно съединение (ако приемем, че имате начин да свържете table1 към table2), но добавете вашата проверка на table1.c1 в условие за присъединяване, така че стойностите на table2 да присъстват само ако c1 <> '1'
select
coalesce(table2.c1, table1.c1) c1,
coalesce(table2.c2, table1.c2) c2,
coalesce(table2.c3, table1.c3) c3
from table1
left outer join table2
on (your keys here)
and table1.c1 <> '1' -- This gets table1 if c1 = '1';
Това решение предполага, че table1 и table2 са свързани. Ако не можете да ги свържете, тогава звучи почти така, сякаш можете да използвате обединение all, в което вземате всички стойности от таблица1, където c1 ='1' и ги обединявате към всички редове на таблица2. Ако е необходимо, можете да включите стойности на table2 само ако c1 <> '1'.
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary
АКТУАЛИЗАЦИЯ
Въз основа на вашите примерни данни и очаквания резултат, моля, използвайте втората заявка по-горе:
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2 where c1 <> '1'
SQL Fiddle:http://www.sqlfiddle.com/#!4/ 710f0/1/0