0

我有这个代码

CREATE OR REPLACE FUNCTION test_func( str CHARACTER VARYING ) RETURNS CHARACTER VARYING 
AS $$

BEGIN
    str := CAST(str AS INTEGER);

    IF  str > 4 THEN
        RETURN 'YES';
    ELSE
        RETURN 'NO';
    END IF;

END;
$$
LANGUAGE plpgsql;

然后,当调用这个函数SELECT test_func('9')

返回错误: operator does not exist: character varying > integer

为什么会这样?为什么str不转换为INTEGER

4

2 回答 2

2

这被设计破坏了。

如果传递给函数的值是有效integer的,则参数应该是integer开头的类型。否则函数体内的强制转换迟早会引发异常。
它应该是:

CREATE OR REPLACE FUNCTION test_func(str integer) ...

然后你不需要任何铸造。

并且 - 只要它像测试用例一样简单 - 使用带有CASE语句或普通 SQL 查询的 SQL 函数:

CREATE OR REPLACE FUNCTION test_func(str int)
  RETURNS text AS
$$
SELECT CASE WHEN str > 4 THEN 'YES' ELSE 'NO' END;
$$
LANGUAGE sql;

请注意,您不能在 Postgres 9.2 之前的SQL 函数中引用参数名称。在旧版本中使用位置参数。$1

于 2013-05-20T20:03:24.950 回答
1

它确实按照您的要求转换为整数。但随后它自动转换为 varchar,因为那是str' 类型。像这样做:

IF str::int > 4 THEN
于 2013-05-20T19:18:50.653 回答