SQL:省略FROM子句

时间:2012-01-09 01:05:42

标签: sql database postgresql

当我想测试一些PostgreSQL函数FOO()的行为时,我发现执行像SELECT FOO(bar)之类的查询很有用,bar是我用作直接输入的一些数据而不必{来自真实桌子的{1}}。

我读过我们可以省略像SELECT这样的语句中的FROM子句,但我不知道多个输入的正确语法。我试过SELECT 1例如,它不起作用。

我该怎么做?

2 个答案:

答案 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