在MS SQL中,我可以执行如下语句:
Declare @foo int = 1, @foo1 int = 42
IF @foo <> 0
BEGIN
SELECT @foo
END
ELSE
BEGIN
SELECT @foo, @foo1
END
有人知道如何在PostgreSQL上运行此语句吗?
编辑:MS SQL示例,如:
CREATE PROCEDURE dbo.spIFtest
@p1 int = 1,
@p2 int = 10,
@isFilter bit = 0
AS
BEGIN
IF @isFilter = 1
BEGIN
SELECT idx FROM rw.octest where idx between @p1 and @p2
END
ELSE
BEGIN
SELECT idx FROM rw.octest
END
END
GO
答案 0 :(得分:0)
使用DO进行警告:
DO $$
DECLARE
foo integer := 1;
foo1 integer := 42;
BEGIN
IF foo <> 0 THEN
PERFORM foo;
ELSE
PERFORM foo, foo1;
END IF;
END;
$$
;
DO
无法返回任何内容。
您可以伪造退货:
DO $$
DECLARE
foo integer := 0;
foo1 integer := 42;
BEGIN
IF foo <> 0 THEN
SELECT INTO foo 1;
RAISE NOTICE 'foo is %', foo;
ELSE
SELECT INTO foo, foo1 1, 42 ;
RAISE NOTICE 'foo is %, foo1 is %', foo, foo1;
END IF;
END;
$$
;
NOTICE: foo is 1, foo1 is 42
DO
答案 1 :(得分:0)
在PostgreSQL DO
中,Block可以执行查询,但不能返回任何值。
因此,问题的第一部分不可能直接在postgresql中实现。
对于问题的第二部分:在PostgreSQL
中,您可以使用功能(功能非常强大且有效),如下所示:
create or replace function spiftest()
returns table(idx_ int)
as $$
declare
p1 int := 1;
p2 int := 10;
isfilter boolean := 0;
begin
if isfilter then
return query
SELECT idx FROM octest where idx between p1 and p2;
else
return query
SELECT idx FROM octest ;
end if;
end;
$$
language plpgsql
调用以上函数获取结果:
select * from spiftest()
您可以使用以下参数编写它:
create or replace function spiftest(p1 int, p2 int, isfilter boolean)
returns table(idx_ int)
as $$
begin
if isfilter then
return query
SELECT idx FROM octest where idx between p1 and p2;
else
return query
SELECT idx FROM octest ;
end if;
end;
$$
language plpgsql
调用上述功能
select * from spiftest(1,10,'t')