我有这段代码
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
?
答案 0 :(得分: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函数中引用参数 names 。使用旧版本中的位置参数$1
。
答案 1 :(得分:1)
它确实按照你的要求转换为整数。但随后它自动转换为varchar,因为它是str
的类型。这样做:
IF str::int > 4 THEN