Как исправить ошибку «оператор не существует: целое число = массив целых чисел»?

Как создать функцию, которая будет подсчитывать количество устройств в таблице "device" по идентификаторам, переданным в массиве входных параметров, без возникновения ошибки "operator does not exist: integer = integer[]"?
Запрос:

CREATE OR REPLACE FUNCTION get_count(VARIADIC ids integer[]) RETURNS int AS $$
	SELECT COUNT(*) FROM device 
	WHERE device.id = ANY(ids)
$$ LANGUAGE SQL
  • 22 января 2024 г. 13:39
Ответы на вопрос 2
Ваш SQL код выглядит почти правильно, за исключением того, что функция объявлена как SQL, но содержимое функции должно быть заключено в BEGIN и END, и это требует использования PL/pgSQL в качестве языка функции, если вы используете блоки кода. Также вам не нужно использовать ключевое слово VARIADIC при передаче массива. 

Следующий код исправляет ошибку и создает функцию, используя PL/pgSQL, которая подсчитывает количество устройств в таблице "device" по идентификаторам, передаваемым в массиве:

```sql
CREATE OR REPLACE FUNCTION get_count(ids integer[]) RETURNS int AS $$
BEGIN
	RETURN (
		SELECT COUNT(*) FROM device 
		WHERE device.id = ANY(ids) -- Проверка наличия id в массиве
	);
END;
$$ LANGUAGE plpgsql;
```

Для вызова этой функции, вы должны передать массив идентификаторов следующим образом:

```sql
SELECT get_count(ARRAY[1, 2, 3]);
```

или, если вы используете ключевое слово VARIADIC, вызов будет выглядеть следующим образом:

```sql
SELECT get_count(VARIADIC ARRAY[1, 2, 3]);
```

Если вы хотите использовать SQL вместо PL/pgSQL, вам не нужно использовать BEGIN и END. Ниже приведен код для SQL-функции:

```sql
CREATE OR REPLACE FUNCTION get_count(ids integer[]) RETURNS int AS $$
	SELECT COUNT(*) FROM device 
	WHERE device.id = ANY(ids) -- Проверка наличия id в массиве
$$ LANGUAGE sql;
```

Оба варианта функций должны работать без ошибки "operator does not exist: integer = integer[]", так как используется правильный синтаксис для сравнения элемента с массивом (ANY).
ANY вместо IN? 
Похожие вопросы