我希望只选择我可以平均的列。 (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子句中,但我不确定如何做到这一点。
答案 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。