2011-01-21 59 views
12

我想创建CAST一个合适的函数来将'字符变化'转换为'整数'。任何人都可以建议一个功能我尝试的一切都失败了Postgresql。 CREATE CAST'字符变化'为'整数'

+4

更换您应该解决您的SQL不依赖于内隐蒙上。永远不要依赖于你的陈述中的暗示表达。 – 2011-01-21 15:54:13

+0

我同意。但是我不能使用现成的软件。 – Simon 2011-01-21 15:59:06

回答

17

使用此项:

CREATE CAST (varchar AS integer) WITH INOUT [AS IMPLICIT]; 

它使用涉及的数据类型的输入/输出功能。

0

我假设你想获得有关隐式转换的Postgres 8.3的行为。

示例请参见这个博客条目:
http://petereisentraut.blogspot.com/2008/03/readding-implicit-casts-in-postgresql.html

哦:和bug的软件供应商,以修复损坏SQL)

编辑

这应该这样做:

 
CREATE FUNCTION toint(varchar) 
    RETURNS integer 
    STRICT IMMUTABLE LANGUAGE SQL AS 
'SELECT cast($1 as integer);'; 

CREATE CAST (varchar AS integer) WITH FUNCTION toint(varchar); 
+0

是的。我发现,但它缺少int4(varchar) – Simon 2011-01-21 16:02:35

+0

它包含一个整型的强制转换,如果我没有弄错,它与int4相同。 – 2011-01-21 16:10:50

1

如果您更新SQL以进行显式强制转换,则上述函数可用。 但是,如果在'create cast'语句的末尾添加'as implicit',则Postgres将能够自动计算出您将整数与可以转换为整数的varchar进行比较时要执行的操作。

这里是我的最新声明,似乎工作“含蓄”:

CREATE FUNCTION toint(varchar) 
    RETURNS integer 
    STRICT IMMUTABLE LANGUAGE SQL AS 
'SELECT cast($1 as integer);'; 

CREATE CAST (varchar AS integer) WITH FUNCTION toint(varchar) as Implicit; 
0

我得到了同样的错误。我有一个COLUMN

代码

声明为类型字符改变

(20)和一个局部变量

l_code

声明为int类型。

我解决了程序

SELECT 
... 
WHERE 
code = l_code AND 
.. 

code = cast(l_code as character varying) AND