If by unnest(Table2.L) != '-' you mean
throw out all the unnested elements that are '-'
then use a derived table and filter out the unnested values you don't want:
select *
from (
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
) dt
where X != '-'
order by X ;
If you mean
ignore all rows from Table2 where L contains '-'
then you can use the @> operator to check if L contains a certain element:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
where not Table1.L @> ARRAY['-']
or you could use ANY:
select unnest(Table2.L) as X, unnest(Table1.O)
from Table1 join Table2 on Table1.code = Table2.code
where not '-' = any(Table1.L)
And do yourself a favor by forgetting that implicit joins exist, always use explicit join conditions.