Em primeiro lugar, é quase sempre mais eficiente fazer tudo em uma única instrução, se possível.
Sua segunda consulta não funciona, pois você está retornando tudo em uma única string. Isso não uma lista delimitada por vírgulas conforme exigido por uma instrução IN.
Há um pequeno truque para contornar isso embora. Supondo que você esteja usando a string para algo entre as duas instruções SELECT, você pode brincar com
regexp_substr()
para transformar sua corda em algo utilizável. Algo assim funcionaria;
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
)
A variável
v_province
teria que ser alterado para ser citado duas vezes, por exemplo '''AB'',''AZ'',''BC'''
para que isso funcione. Aqui está um exemplo de trabalho