Quando utilizzi un case
, devi restituire solo un singolo record, non più di 1. Per ottenere il risultato desiderato, userei un join esterno sinistro (supponendo che tu abbia un modo per unire table1 a table2), ma aggiungere il tuo controllo su table1.c1 nel condizione di join in modo che i valori table2 siano presenti solo se 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';
Questa soluzione presuppone che table1 e table2 siano correlate. Se non riesci a metterli in relazione, sembra quasi che tu possa usare un'unione in cui prendi tutti i valori da table1 dove c1 ='1' e unisci quelli a tutte le righe table2. Se necessario, puoi includere i valori table2 solo se c1 <> '1'.
select c1, c2, c3 from table1 where c1 = '1'
union all
select c1, c2, c3 from table2; -- where c1 <> '1' -- if necessary
AGGIORNAMENTO
In base ai dati di esempio e all'output previsto, utilizza la seconda query sopra:
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