使用以下代码,我可以从我的表中选择一些共享相同前缀(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无法实际执行命令行。问题是为什么?是否有更好的方法来执行此过程,以便它实际执行?
答案 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语句。