SQL:省略FROM子句

Wei*_*ier 2 sql database postgresql

当我想测试一些PostgreSQL函数的行为时,FOO()我发现执行查询很有用SELECT FOO(bar),bar是一些我用作直接输入的数据,而不必SELECT从真正的表中执行.

我读过我们可以在FROM语句中省略该子句,SELECT 1但我不知道多个输入的正确语法.我试过SELECT AVG(1, 2),例如,它不起作用.

我怎样才能做到这一点 ?

mu *_*ort 6

使用PostgreSQL,您可以使用VALUES表达式生成内联表:

VALUES计算值表达式指定的行值或行值集.它最常用于在较大的命令中生成"常量表",但它可以单独使用.

强调我的.然后,您可以将聚合函数应用于"常量表":

select avg(x)
from (
    values (1.0), (2.0)
) as t(x)
Run Code Online (Sandbox Code Playgroud)

或者只是select expr如果expr不是聚合函数:

select sin(1);
Run Code Online (Sandbox Code Playgroud)

您还可以定义自己的avg函数,该函数在数组上运行并在函数内隐藏FROM:

create function avg(double precision[]) returns double precision as $$
    select avg(x) from unnest($1) as t(x);
$$ language 'sql';
Run Code Online (Sandbox Code Playgroud)

然后:

=> select avg(array[1.0, 2.0, 3.0, 4.0]);
 avg 
-----
 2.5
Run Code Online (Sandbox Code Playgroud)

但除非你经常这样做,否则这只会变得愚蠢.

此外,如果您使用的是8.4+,则可以编写可变参数函数并取消该数组.内部与数组版本相同,您只需添加variadic到参数列表:

create function avg(variadic double precision[]) returns double precision as $$
    select avg(x) from unnest($1) as t(x);
$$ language 'sql';
Run Code Online (Sandbox Code Playgroud)

然后在没有数组的情况下调用它:

=> select avg(1.0, 1.2, 2.18, 11, 3.1415927);
    avg     
------------
 3.70431854
(1 row)
Run Code Online (Sandbox Code Playgroud)

感谢depesz 指向 PostgreSQL中的变量函数支持的round-through- go -google指针.