PostgreSQL简单IF ELSE语句

时间:2020-07-29 14:19:26

标签: postgresql

在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

2 个答案:

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