Postgres嵌套的if-in-case查询

8

你能告诉我为什么以下代码在PostgreSQL中不起作用吗?

See updated code below

更新:

我希望这个查询能够返回浮点数"0.30"。这个结构只是为了测试目的,我有一些依赖于这个条件结构的复杂查询... 但是我不知道如何修复它。

结果为:

ERROR:  syntax error at or near "1"
LINE 4:     if 1=1 then

更新:

这个结构出现在一个函数中...所以我想要做以下操作:

CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$
  BEGIN
    select (
      case (select '1')
      when '1' then
        if 1=1 then
          0.30::float
        else
          0.50::float
        end
      else
         1.00::float
      end
    );
  END;
$$ LANGUAGE plpgsql;

select f_test(1) as test;

上面有错误信息,请参考。


使用适当的语言,无需在此使用任何超出pg的内容。 - Woot4Moo
定义“不起作用”。你原本希望发生什么事情,实际上又发生了什么。 - Hamish
你期望的实际输出是什么? - Woot4Moo
2个回答

9
在Postgres中,普通的SQL查询没有类似于IF expr THEN result ELSE result END这样的语法。由于没有像MySQL中的IF()函数,所以您必须使用CASE
select (
  case (select '1')
  when '1' then
    case when 1=1 then 0.30::float else 0.50::float end
  else
     1.00::float
  end
);

是的,请参见http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html。 - BvuRVKyUVlViVIc7
不,那是针对存储过程的。MySQL 也有一个针对它们的,但 不是 针对普通 SQL 的。 - AndreKR
我更新了我的帖子,我在一个函数中使用这段代码...所以它应该可以工作吧? - BvuRVKyUVlViVIc7
不,你仍然在SELECT语句内部。这些是您可以在普通查询中使用的条件表达式:http://www.postgresql.org/docs/8.4/static/functions-conditional.html - AndreKR
这个问题也曾经让我感到困惑。PostgreSQL 有一个 IF 控制语句,但是它只能在函数内部使用。对于查询,你必须使用 CASE - Aaron
点赞,因为向我展示了如何在Postgres中嵌套多个CASE语句。 - Stew-au

3
我不知道你想通过这个函数实现什么,但这里有一个可用的版本。
CREATE FUNCTION f_test(myvalue integer) RETURNS float AS $$
BEGIN
    IF myvalue = 1 THEN
            IF 1=1 THEN
                    RETURN 0.30::FLOAT;
            ELSE
                    RETURN 0.50::FLOAT;
            END IF;
    ELSE
            RETURN 1.0::FLOAT;
    END IF;
END;

如果输入值为1,则该函数返回0.3,否则返回1。编辑:请注意,该函数永远不会返回0.5。


这只是一个没有意义的测试函数。但是我有一些复杂的查询,它们依赖于这个条件结构。我将尝试您的答案...谢谢。 - BvuRVKyUVlViVIc7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接