0
votes

Comment lancer un varchar dans un int [] en utilisant l'opérateur "dans" dans PostgreSQL

J'ai du mal à ce sujet. J'essaie de lancer un varchar code> contenant une liste de numéros dans un int graph code>, afin de servir un opérateur code> dans code> sur un où code> clause. Ceci est la dernière version de mon code.

 SQL Error [42883]: ERROR: operator does not exist: integer = integer[]
  Hint: No operator matches the given name and argument types. You might need to add explicit type casts.
  Where: PL/pgSQL function is_product_in_categories(integer,character varying) line 7 at SQL statement


3 commentaires

La syntaxe de Postgres Array est '{1, 2, 3}' . Mais vous ne voulez probablement pas cela - au lieu de cela, vous devriez diviser la chaîne par un séparateur ou rendre votre fonction prendre un paramètre de tableau en premier lieu.


Thask Bergi, mais j'ai toujours une erreur de syntaxe utilisant '{1, 2, 3}' . L'erreur est Erreur SQL [42883]: Erreur: l'opérateur n'existe pas: INTEGER = INTEGER [] Ce qui signifie que le validateur interpréte le contenu de la parenthèse comme un numéro unique.


Le problème semble être que l'opérateur dans n'accepte pas un tableau. Par exemple, catégorie_id in (tableau [1,2,3]) soulève la même exception.


3 Réponses :


2
votes

Utilisez string_to_array () pour convertir une chaîne en une chaîne en une matrice (texte): xxx

si vous contrôlez la chaîne (par exemple, vous la construisez vous-même), Vous pouvez utiliser l'un ou l'autre de ces deux: xxx


0 commentaires

0
votes

Le problème avec l'opérateur code> dans code> est-il ne pas admettre un tableau comme argument. Au lieu de cela, il attend une simple liste de scalaires. Voir la documentation postgreSQL ici https://www.postgresql.org/docs/ 9.0 / FONCTIONS-COMPARISONS.HTML # AEN16964

Pour éviter cette limitation, le = Toute combinaison code> accepte une matrice comme argument. Le code se termine de cette façon. P>

create or replace function is_product_in_categories (
  _product_id integer,
  _cat_list   varchar
)
returns boolean
as $$
declare
  _n integer;
begin
  _n = 0;

  select count(*) 
  into _n
  from of_category_products 
  where product_id = _product_id and category_id = any (_cat_list::int[]);

  return _n > 0;
end;
$$ language plpgsql;

select is_product_in_categories(1, '{1, 2, 3}')


0 commentaires

1
votes

Réviser votre déclaration de fonction et définir comme tableau d'entiers variadiques: xxx

ou simplement comme une éventail d'entiers: xxx
Vous pouvez réduire la fonction à une seule déclaration. xxx

voir ici pour un exemple complet des deux.


1 commentaires

Merci Belayer. Ces solutions sont encore plus propres que les miennes. J'apprécie que l'approche existe dans le but de la fonction.