我正在对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
无需将其放在函数或过程中。我能在PostgreSQL中做到吗?
在网上搜索我在MySQL找到了negative answer,但我没有找到Postgres的答案。
答案 0 :(得分:19)
您不能 DECLARE
(全局)变量(well, there are ways around this)也不能使用普通SQL循环 - recursive CTEs as provided by @bma除外。
但是,这种临时程序代码有DO
statement。 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$
如果没有另外指定,正文中的语言为plpgsql
。但是,如果您声明它,可以使用any registered procedural language(例如:LANGUAGE plpython
)。
Postgres还提供generate_series()
来生成ad-hoc集合,这可以避免在许多情况下需要循环。 Try a search here on SO for examples.
此外,您可以使用普通SQL中的data-modifying CTE中的WHERE
子句来分叉案例并模拟IF .. THEN .. ELSE .. END
...
答案 1 :(得分:3)
您可以使用WITH RECURSIVE递归查询结果集,假设您使用的是Postgresql 8.4+。文档:http://www.postgresql.org/docs/current/static/queries-with.html
这将允许您循环设置并以各种方式处理数据。