我有一个包含100多列char,int和numeric数据类型的表 但我不知道他们是如何放在桌子里的。可能吗 查询只包含其中一种数据类型的列?
我尝试过'数字'类型,我在其中找到了列名 INFORMATION_SCHEMA。然后我使用'with'并尝试使用它 提取与'with'中包含的查询匹配的列。 它不起作用,因为最后一行中的'column_name'不是 有效。有任何建议如何正确吗?
WITH numeric_columns AS
(SELECT column_name from information_schema.columns
WHERE table_schema='table_admin' and
table_name='my_table'
AND data_type='numeric')
SELECT * from table_admin.my_table
WHERE column_name (????) IN (SELECT * FROM numeric_columns);
答案 0 :(得分:0)
plpgsql函数中需要dynamic SQL。由于列数未知,因此必须以某种方式将它们合并到一个列中。其中一种合适的方法是使用jsonb.
示例功能:
create or replace function numeric_cols(sname text, tname text)
returns setof jsonb language plpgsql as $$
declare
select_list text;
begin
select string_agg(column_name, ',')
into select_list
from information_schema.columns
where table_schema = sname
and table_name = tname
and data_type = 'numeric';
return query
execute format($fmt$
select to_jsonb(t)
from (
select %s
from %I.%I
) t
$fmt$, select_list, sname, tname);
end $$;
使用示例:
create schema if not exists table_admin;
create table table_admin.my_table(id serial primary key, n1 numeric, n2 numeric, t1 text);
insert into table_admin.my_table (n1, n2, t1) values
(100, 200, 'first'),
(200, 300, 'second');
select *
from numeric_cols('table_admin', 'my_table');
numeric_cols
------------------------
{"n1": 100, "n2": 200}
{"n1": 200, "n2": 300}
(2 rows)