2015-01-01 104 views
0

选择列使用下面的代码,我可以选择分享一些列相同的前缀(或者upreg_srt或downreg_srt)从我的表和删除(删除)它们:具有相同前缀

DO 
$do$ 
DECLARE 
    _column TEXT; 
BEGIN 
FOR _column IN 
    SELECT DISTINCT quote_ident(column_name) 
    FROM information_schema.columns 
    WHERE table_name = 'all_se_13patients_downreg_ranks' 
    AND column_name LIKE '%upreg_srt' OR column_name LIKE '%downreg_srt' 
    AND table_schema NOT LIKE 'pg_%' 
    order by quote_ident 
LOOP 
    RAISE NOTICE '%', 
    -- EXECUTE 
    'ALTER TABLE all_se_13patients_downreg_ranks DROP COLUMN ' || _column; 
END LOOP; 
END 
$do$ 

此代码工作在Postgres下很好。 (当然,首先需要注意--EXECUTE行!) 是否有一种方法可以利用/更改此代码(或使用不同的脚本),以便将所选列(具有共享前缀的列)实际保存到子表中?伪代码:

select [my chosen columns] 
into myNewTbl 
from myOriginalTbl 

我能够运行下面的代码:

DO 
$do$ 
DECLARE 
qry TEXT; 
BEGIN 
    SELECT 'SELECT id_13,' || substr(cols,2,length(cols)-2) || 
     ' FROM all_se_13patients_downreg_ranks' INTO qry 
    FROM (
     SELECT array(
      SELECT DISTINCT quote_ident(column_name::text) 
      FROM information_schema.columns 
      WHERE table_name = 'all_se_13patients_downreg_ranks' 
      AND column_name LIKE '%downreg_srt' 
      order by quote_ident    
    )::text cols 
     -- CAST text so we can just strip off {}s and have column list 
    ) sub; 
    --EXECUTE qry; 
    RAISE NOTICE '%',qry; 
END 
$do$ 

它可以很好地 - 但我不能使用EXECUTE qry行出于某种原因。 如果我尝试RAISE NOTICE '%',qry;一行,我会得到一个输出 - 这基本上是命令行,我稍后可以在新的查询窗口(!)中复制/粘贴并执行它。因此,我想知道为什么EXECUTE部件不起作用?

运行的程序与RAISE NOTICE行我得到:

NOTICE: SELECT id_13,agk_downreg_srt,bvi_downreg_srt,cbk_downreg_srt,dj_downreg_srt,dkj_downreg_srt,flv_downreg_srt,ghw_downreg_srt,gvz_downreg_srt,idy_downreg_srt,prw_downreg_srt,spn_downreg_srt,zgr_downreg_srt,znk_downreg_srt FROM all_se_13patients_downreg_ranks

但是,如果我尝试运行与EXECUTE一部分的过程,而不是我得到:

Query returned successfully with no result in 51 ms.

所以问题是, postgres无法真正执行命令行。问题是为什么?有没有更好的方式来执行这个过程,所以它实际上执行?

回答

1

However, if I try to run the procedure with the EXECUTE part instead I get: "Query returned successfully with no result in 51 ms." - so the problem is that postgres fails to actually execute the command line

不,PostgreSQL成功执行了查询。这就是“查询成功返回”的意思。它没有返回结果,花了51毫秒。

如果您想要execute a dynamic SELECT statement想要查看某种结果,请使用execute ... into

do 
$$ 
declare 
    qry text; 
    table_name text; 
begin 
    qry := 'select table_name from information_schema.tables where table_name like ''pg_%'';'; 
    raise notice '%', qry; 
    execute qry into table_name; 
    raise notice '%', table_name; 
END 
$$ 
 
NOTICE: select table_name from information_schema.tables where table_name like 'pg_%'; 
NOTICE: pg_statistic 
Query returned successfully with no result in 24 ms. 

值 “pg_statistic里” 是在结果集中的第一行。使用execute这种方式将仅第一行的值分配给table_name。这是设计。

如果要将列名插入到表中,则需要编写INSERT语句,而不是SELECT语句。

+0

谢谢@Mike Sherrill'猫召回'! - 我试过了: 做 $$ 声明 qry text; table_name text; begin qry:='从information_schema.tables中选择表名,其中table_name如''dkj%'';'; 提出通知'%',qry; 执行qry into table_name; 提出通知'%',table_name; END $$ 实际上我得到: 注意:从information_schema中选择table_name。table_name如'dkj%'; 注意:dkj_p_k4 查询成功返回,14毫秒内没有结果。 很酷。它给了我数据库中共享相同前缀('dkj')的7个表中的第一个。 我可以获得所有这些吗? – Roy

+0

当我试着INSERT语句,像这样: 做 $$ 宣布 qry文本; table_name text; begin qry:='INSERT table_name from information_schema.tables where table_name like''dkj%'';'; 提出通知'%',qry; 执行qry into table_name; 提出通知'%',table_name; END $$ 我收到以下错误消息: – Roy

+0

注意:从information_schema.tables中插入table_name,其中table_name如'dkj%'; 错误:在“table_name”处或附近的语法错误 LINE 1:从information_schema.tables中插入表名...其中表... ^ QUERY:INSERT table_name from information_schema.tables where table_name like'dkj%'; 语境:PL/pgSQL函数inline_code_block第9行,EXECUTE语句 **********错误********** 错误:在“table_name”或其附近的语法错误 SQL状态:42601 上下文:PL/pgSQL函数inline_code_block第9行,EXECUTE语句 – Roy

相关问题