选择具有相同前缀的列

时间:2015-01-01 01:18:00

标签: postgresql select plpgsql dynamic-sql

使用以下代码,我可以从我的表中选择一些共享相同前缀(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行运行程序:

  

注意:选择   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   来自all_se_13patients_downreg_ranks

但是,如果我尝试使用EXECUTE部分运行该程序,我会得到:

  

查询成功返回,结果为51毫秒。

所以问题是postgres无法实际执行命令行。问题是为什么?是否有更好的方法来执行此过程,以便它实际执行?

1 个答案:

答案 0 :(得分:1)

  

但是,如果我尝试使用EXECUTE部分而不是I来运行该程序   get:" Query返回成功,51 ms没有结果。" - 所以   问题是postgres无法实际执行命令行

不,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语句。