只在列中选择int类型?

时间:2014-06-11 18:12:38

标签: sql postgresql types int aggregate-functions

我希望只选择我可以平均的列。 (Int是我唯一知道的,但如果还有其他人,我想知道。

select avg(case when <column> = int then <column> else 0 end)

这是我会尝试的,但它似乎不起作用。当我尝试这个时:

Select Avg(<column>) as <alias>

它说:

ERROR: function avg(double precision) does not exist

我想我可能需要在连接语句中将它添加到from子句中,但我不确定如何做到这一点。

2 个答案:

答案 0 :(得分:2)

Postgres的平均聚合函数是 avg(),适用于一系列数字类型 ,包括 {{1 }}。特别是per documentation:

  

smallint,int,bigint,real,double precision,numeric或interval

您可以使用pg_typeof()来确定任何值(或列)的实际数据类型。

识别列

要... double precision

select only the columns that I can average

动态计算

动态确定具有聚合依赖于它的列的类型并不是一项微不足道的任务 这可行(不包括特殊情况SELECT attname, atttypid::regtype::text FROM pg_attribute WHERE attrelid = 'tbl'::regclass AND atttypid = ANY ('{int2,int,int8,real,float8,numeric,interval}'::regtype[]) AND attnum > 0 AND NOT attisdropped ORDER BY attnum; ):

interval

SQL Fiddle展示了两者。

对于大表,在动态汇编语句之前检查列类型会更有效...

答案 1 :(得分:1)

表达

regexp_replace(val, '\d', '', 'g')
如果val仅包含数字,则

为空字符串,因此

select case regexp_replace(val, '\d', '', 'g') 
    when '' then val::int 
    else null end
如果val表示无符号整数,则

给出整数值,否则返回null。