PostgreSQL在函数外部循环.那可能吗?

JGu*_*ezC 6 t-sql postgresql loops function plpgsql

我正在对PostgreSQL与SQLServer进行比较,以便进行迁移.现在我正在评估T-SQL与PL/pgSQL,事实是在T-SQL中你可以使用循环或声明变量,例如:

declare @counter int
set @counter = 0
while @counter < 10
begin
   set @counter = @counter + 1
   print 'The counter is ' + cast(@counter as char)
end
Run Code Online (Sandbox Code Playgroud)

没有必要将它放在函数或过程中.我可以在PostgreSQL中做到吗?

在网上搜索我在MySQL中找到了一个否定的答案,但我没有找到Postgres的答案.

Erw*_*ter 19

除了@bma提供递归CTE之外,你不能 DECLARE(全局)变量(好的,有这种方法)也不能用普通的SQL循环.

但是,有这种临时程序代码的DO陈述.Postgres 9.0推出.它的工作方式类似于一次性功能,但不返回任何内容.你可以RAISE注意到,所以你的例子可以正常工作:

DO
$do$
DECLARE
   _counter int := 0;
BEGIN
   WHILE _counter < 10
   LOOP
      _counter := _counter + 1;
      RAISE NOTICE 'The counter is %', _counter;  -- coerced to text automatically
   END LOOP;
END
$do$
Run Code Online (Sandbox Code Playgroud)

如果没有另外指定,则正文中的语言是plpgsql.您可以使用任何已注册的程序语言,如果您声明它(如:)LANGUAGE plpython.

Postgres还提供generate_series()ad-hoc生成集,这可以避免在许多情况下循环的需要.在这里尝试搜索SO以获取示例.

此外,您可以在纯SQL WHERE中使用数据修改CTE中的子句来分叉案例并模拟IF .. THEN .. ELSE .. END...