In primo luogo, è quasi sempre più efficiente fare tutto in un'unica istruzione, se possibile.
La tua seconda query non funziona poiché stai restituendo tutto in una singola stringa. Questo non un elenco delimitato da virgole come richiesto da un'istruzione IN.
C'è un piccolo trucco per aggirare questo però. Supponendo che tu stia usando la stringa per qualcosa tra le due istruzioni SELECT puoi giocare con regexp_substr()
per trasformare la tua stringa in qualcosa di utilizzabile.
Qualcosa del genere funzionerebbe;
select city
from vwpersonprimaryaddress
where state in (
select regexp_substr(v_province,'[^'',]+', 1, level)
from dual
connect by regexp_substr(v_province, '[^'',]+', 1, level) is not null
)
La variabile v_province
dovrebbe essere modificato per essere citato due volte, ad esempio '''AB'',''AZ'',''BC'''
affinché funzioni.
Ecco un esempio funzionante