Estou tentando fazer uma consulta que deve retornar registros com base em uma subconsulta. Aqui está um exemplo:
selecione ... onde tablename like ('%subquery_result%');
A subconsulta está gerando a string conforme o esperado:
appldb=# select '''%_p' ||
replace(substring(CAST(current_date - INTERVAL '1 MONTH' AS text), 1, 7),'-', '_') || '%''';
?column?
---------------
'%_p2019_09%'
(1 row)
Usando a string acima, os registros são retornados:
select tablename from pg_tables
where tablename like '%_p2019_09%' limit 2;
tablename
---------------------
part_p2019_09_26
part_p2019_09_29
(2 rows)
Mas quando uso a query completa não tenho retorno:
appldb=# select tablename
from pg_tables
where tablename like ( select '''%_p' ||
replace(substring(CAST(current_date - INTERVAL '1 MONTH' AS text), 1, 7),'-', '_') || '%''' );
tablename
-----------
(0 rows)
Eu já tentei remover parênteses ao redor da subconsulta. Mas a consulta deu um erro.
Perdi alguma etapa para garantir a cláusula where para interpretar a subconsulta?
Você está incluindo aspas simples literais na consulta LIKE (conforme mostrado na saída de sua primeira consulta). Essas aspas literais não estão presentes nos dados, portanto, elas não correspondem.
incluir o select é inofensivo neste caso, mas não é necessário:
Você nem precisa dos parênteses ao redor da coisa toda, pois || liga mais apertado do que LIKE, mas eu não sabia disso até fazer o experimento.