当我想测试一些PostgreSQL函数FOO()
的行为时,我发现执行像SELECT FOO(bar)
之类的查询很有用,bar是我用作直接输入的一些数据而不必{来自真实桌子的{1}}。
我读过我们可以省略像SELECT
这样的语句中的FROM
子句,但我不知道多个输入的正确语法。我试过SELECT 1
例如,它不起作用。
我该怎么做?
答案 0 :(得分:6)
使用PostgreSQL,您可以使用VALUES expression生成内联表:
VALUES计算值表达式指定的行值或行值集。 最常用于在较大的命令中生成“常量表”,但它可以单独使用。
强调我的。然后,您可以将聚合函数应用于“常量表”:
select avg(x)
from (
values (1.0), (2.0)
) as t(x)
如果select expr
不是聚合函数,则只需expr
:
select sin(1);
您还可以定义自己的avg
函数,该函数在数组上运行并在函数内隐藏FROM:
create function avg(double precision[]) returns double precision as $$
select avg(x) from unnest($1) as t(x);
$$ language 'sql';
然后:
=> select avg(array[1.0, 2.0, 3.0, 4.0]);
avg
-----
2.5
但除非你经常这样做,否则这只会变得愚蠢。
此外,如果您使用的是8.4+,则可以编写variadic functions并取消该阵列。内部结构与数组版本相同,您只需将variadic
添加到参数列表中:
create function avg(variadic double precision[]) returns double precision as $$
select avg(x) from unnest($1) as t(x);
$$ language 'sql';
然后在没有数组的情况下调用它:
=> select avg(1.0, 1.2, 2.18, 11, 3.1415927);
avg
------------
3.70431854
(1 row)
感谢depesz了解PostgreSQL中round-about-through-google pointer到可变参数函数的支持。
答案 1 :(得分:4)
要在大多数SQL中表达SET,您需要实际表达一个表..
SELECT
AVG(inlineTable.val)
FROM
(
SELECT 1 AS Val
UNION ALL
SELECT 2 AS Val
)
AS inLineTable