|
基于此函数的参数,我创建了以下函数返回一组列:
( ~4 C% ?: O% G, z" A0 ^ u4 `( eCREATE OR REPLACE FUNCTION getColumns(IN _column1 text,IN _column2 text,IN _column3 text,IN _column4 text,IN _table text) RETURNS TABLE(cmf1 text,cmf2 text,cmf3 text,cmf4 text) AS$BODY$BEGIN RETURN QUERY EXECUTE SELECT || case when _column1 = 'None' then quote_literal('None') else quote_ident(_column1) end || '::text as cmf || case when _column2 = 'None' then quote_literal('None') else quote_ident(_column2) end || '::text as cmf2,|| case when _column3 = 'None' then quote_literal('None') else quote_ident(_column3) end || '::text as cmf3, || case when _column3 = 'None' then quote_literal('None') else quote_ident(_column3) end || '::text as cmf FROM ' || _table; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100 ROWS 1000;样本表的使用:# s5 {5 i7 H: p E) @( q2 u7 n
CREATE TABLE test20130205( a text, b text, c character varying, d text);这个功能我可以用以下方法:
' K3 k$ c! y- G- }! [" \& E" vselect * from getColumns('a','b','c','d','test20130205');我确实有以下问题:
$ ^* ]3 \6 o9 O) p8 Q2 h* N$ I以任何数量的列为输入,我如何扩展此函数(目前我仅限于4列),如下所示:8 ? g, T1 c" y2 K* [8 k+ }$ c
getColumns([textColumn1,...,textColumnN],'table')目前,如果我需要少于4列,我必须使用无作为参数值。如何避免这种情况?我认为这将通过回答最后一个问题自动解决( J7 O! u* k" h: ^0 {
我能以某种方式保留输出中的数据类型吗?如果没有,我能使用更多的数组参数吗?函数如下:9 [5 L' P6 [6 e* g$ }
getColumns([textColumn1,…,textColumnN],
$ N6 x8 ~6 ^- m" ^, _ [numericColumn1,…,numericColumnM],
4 h! p8 t, |, K, S2 V2 n+ J/ b [dateColumn1,…,dateColumnO],+ n! H8 ~ V3 e7 I: P/ W2 P( P3 @
[intColumn1,…,intColumnP],
- I7 L+ \, T/ y ^! R" T ‘table’
/ P! \! @8 B: }% ^& N)1 ^9 \8 d' ^7 u1 l; Q
& K7 ^( K- t) e% Z/ R9 | 解决方案: |
|