2

我正在使用 PostgreSQL 8.1。

我对这个函数中隐式转换的情况感到困惑:

CREATE OR REPLACE FUNCTION this_is_weird(v_input TEXT)
RETURNS TEXT AS $$
BEGIN
        IF v_input > 113 THEN
                RETURN 'answer1';
        ELSE
                RETURN 'answer2';
        END IF;
END;
$$ LANGUAGE plpgsql;

输入'17'(作为字符串)给出返回值'answer1'。但是如果我输入

SELECT '17' > 113

在 psql 中,我得到'f'.

(我当然可以通过添加明确的演员来解决这个问题,v_input::integer.)

4

1 回答 1

2

词法比较中,17 大于113

regress=> SELECT '17' > '113';
?column? 
----------
 t
(1 row)

如果要进行数字比较,请不要进行文本比较。

因为您正在将文本值与数字进行比较,所以将数字转换为文本并作为文本进行比较。您的代码“有效”(即运行没有错误),因为它依赖于非常旧的 PostgreSQL 版本中的错误功能,在该版本中,服务器会在需要时将操作数隐式转换为文本。事实证明,这可以掩盖应用程序错误,并且可以轻松编写不正确的代码,因此在 8.3 中删除了隐式强制转换。有关该主题的一些信息,请参阅Peter 的博客条目

在 PostgreSQL 8.3 及更高版本中,您的代码会产生错误。

您需要计划升级,从长远来看,出于各种原因,它将为您节省时间和麻烦。删除有max_fsm_pages利于自动调整它;能见度图;大大改进了自动真空;...即使您不需要性能改进,升级也有很多好处。阅读每个主要版本(8.2.0、8.3.0 等)的发行说明以获取升级和兼容性建议。

于 2013-03-28T00:02:21.543 回答