2014-01-21 4 views
0

Я пытаюсь создать пользовательскую функцию в Postgresql:Невозможно создать простую функцию Postgresql

CREATE FUNCTION get_balance(user_id integer, statuses integer[]) RETURNS INTEGER 
AS $$ 
select SUM(table1.credit) 
from table1 

inner join table2 
on table2.field1 = table1.id 

inner join table3 
on table3.field1 = table2.id 
where table3.status_id in (statuses); $$ 

LANGUAGE SQL; 

Ошибка является:

ERROR: operator does not exist: integer = integer[] 
LINE 11: where table3.status_id in (statuses); $$ 

Что я делаю неправильно?

ответ

1

Это:

table3.status_id in (statuses) 

может быть упрощена для примера в:

regress=> SELECT 1 IN (ARRAY[1,2,3]); 
ERROR: operator does not exist: integer = integer[] 
LINE 1: SELECT 1 IN (ARRAY[1,2,3]); 
       ^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. 

... но IN ожидает буквального список, например:

regress=> SELECT 1 IN (1, 2, 3); 

Так как вы хотите для передачи массива вы хотите использовать = ANY(...), который ожидает ввода массива:

regress=> SELECT 1 = ANY (ARRAY[1,2,3]); 
?column? 
---------- 
t 
(1 row) 
Смежные вопросы