Sql postgres-将变量传递给not like运算符

Sql postgres-将变量传递给not like运算符,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,我们有带有日期字段的表名,如表名、表年、表月、表日。我们想使用过程分析两天以上的表,并得出以下过程。 但看起来带not like表达式的select命令并没有拾取两天以上的表,而是拾取所有表。 我做错了什么。请建议 DO $$ DECLARE tab RECORD; schemaNa VARCHAR := 'test'; _now_date varchar := TO_CHAR((NOW()-2) :: DATE, 'yyyy_mm_dd') ; BEGIN for tab in

我们有带有日期字段的表名,如表名、表年、表月、表日。我们想使用过程分析两天以上的表,并得出以下过程。 但看起来带not like表达式的select命令并没有拾取两天以上的表,而是拾取所有表。 我做错了什么。请建议

DO $$
DECLARE
  tab RECORD;
  schemaNa VARCHAR := 'test';
  _now_date varchar := TO_CHAR((NOW()-2) :: DATE, 'yyyy_mm_dd') ;
BEGIN
  for tab in (select relname AS table_name from  pg_stat_user_tables where schemaname='test' and relname not like '%_now_date%' order by 1)
  LOOP
    RAISE NOTICE 'ANALYZE %1.%2', schemaNa, tab.table_name;
    RAISE NOTICE '%',_now_date;
    EXECUTE 'ANALYZE '||schemaNa||'.'||tab.table_name;
  end loop;
end
$$;

不要将变量名括在单引号中。生成动态SQL时,最好使用
format()

DO $$
DECLARE
  tab RECORD;
  l_schema VARCHAR := 'test';
  l_sql text;
  _now_date varchar := TO_CHAR(current_date - 2, 'yyyy_mm_dd');
BEGIN
  for tab in (select relname AS table_name 
              from  pg_stat_user_tables 
              where schemaname = l_schema
              and relname not like '%'||_now_date||'%'
              order by 1)
  LOOP
    l_sql := format('ANALYZE %I.%I', l_schema, tab.table_name); 
    RAISE NOTICE '%', l_sql;
    RAISE NOTICE '%',_now_date;
    EXECUTE l_sql;
  end loop;
end
$$;