我正在尝试进行一个应该基于子查询返回记录的查询。这是一个例子:
select ... where tablename like ('%subquery_result%');
子查询按预期生成字符串:
appldb=# select '''%_p' ||
replace(substring(CAST(current_date - INTERVAL '1 MONTH' AS text), 1, 7),'-', '_') || '%''';
?column?
---------------
'%_p2019_09%'
(1 row)
使用上面的字符串,返回记录:
select tablename from pg_tables
where tablename like '%_p2019_09%' limit 2;
tablename
---------------------
part_p2019_09_26
part_p2019_09_29
(2 rows)
但是当我使用完整的查询时,我没有返回:
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)
我已经尝试删除子查询周围的括号。但是查询出错了。
我是否错过了确保where子句解释子查询的任何步骤?
您在 LIKE 查询中包含文字单引号(如第一个查询的输出所示)。这些文字引号不存在于数据中,因此它们不匹配。
在这种情况下,包括 select 是无害的,但没有必要:
你甚至不需要整个东西的括号,因为 || 比 LIKE 结合得更紧,但直到我做了实验我才知道。