在PostgreSQL中默认是大小写敏感的,并默认会将SQL语句转化为小写。
今天碰到同事在GP里面建表的时候给列名加上引号,如下:
create table t3("ID" int,"INFO" text);
这样会导致将列名变成了大写,那么如果直接查询就会报错:
bill@bill=>select id from t3;
ERROR: column "id" does not exist
LINE 1: select id from t3;
^
bill@bill=>select ID from t3;
ERROR: column "id" does not exist
LINE 1: select ID from t3;
^
结果同事在gp里面建了几十张表都是这样,准备用talend进行抽数时就出现错误:
ERROR: missing data for column “referenceid”
不过还好我们可以通过information_schema.columns视图去查询哪些列是大写的,来实现批量修改的功能。
select * from information_schema.columns
where table_schema='dwd'
and table_name<>'pg_stat_statements'
and column_name <> lower(column_name);
既然可以查出来,那么我们新建一个函数就可以实现批量修改的功能了:
create or replace function f_exec()
returns void as $$
declare
x varchar(500);
begin
for x in(
SELECT
'alter table "' || table_name || '" rename column "' || column_name || '" to ' || lower( column_name ) || ';' alter_column
FROM
information_schema.columns
WHERE
table_schema = 'dwd'
AND column_name <> lower(column_name)
AND table_name<>'pg_stat_statements')
loop
execute x ;
end loop;
end;
$$ language plpgsql;
最后执行该函数,大功告成!
bill@bill=>select f_exec();
f_exec
--------
(1 row)