mi e' venuta in mente una possibile soluzione.
Prendi la tabella e filitri con lingua=stringa null. chiamiamola tab A.
Prendi la stessa tabella e la rifiltri con lingua=parametro di input. chiamiamola tab B
Metti in left join le due query in line per citta.
A questo punto se B.ID non e' null vuol dire che hai una lingua valorizzata e usi i valori di B, altrimenti vuol dire che c'era solo il valore con stringa vuota ed esponi i valori di A.
Na roba tipo
codice:
select
coalesce(B.id, a.id) as ID,
a.id_citta,
a.titolo,
coalesce(b.lingua,a.lingua) as lingua
from
( select * from tabella where lingua='') as A left join
(select * from tabella where lingua=<parametro>) as B
on a.id_citta=b.id_citta
ti trovi ?