L'explication la plus évidente est que vous essayez de faire des maths avec une chaîne ...
The attempted conversion of a character string to a number failed because the character string was not a valid numeric literal. Only numeric fields or character fields containing numeric data may be used in arithmetic functions or expressions. Only numeric fields may be added to or subtracted from dates.
http://ora-01722.ora-code.com/
Mise à jour # 1:
Votre description me préoccupe:
I am trying to use a subquery that returns a comma delimited string in a IN clause.
Y notre sous-requête doit pas renvoyer une chaîne délimitée par des virgules (sauf si g.group_id
est une chaîne et attend une chaîne délimitée par des virgules). Vous devez récupérer les éléments individuels en autant de lignes que nécessaire (moins de 1 000 de toute façon).
Mise à jour # 2:
Juste pour préciser:
SELECT *
FROM (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO;
FOO_ID
----------------------
1
2
3
Vous pouvez faire ceci:
SELECT *
FROM (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (1, 2);
FOO_ID
----------------------
1
2
Mais pas:
SELECT *
FROM (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN ('1,2');
SQL Error: ORA-01722: invalid number
Parce que vous ne pouvez pas comparer le numéro 1
avec la chaîne '1,2'
. Les sous-requêtes suivent des règles similaires:
SELECT *
FROM (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL
);
FOO_ID
----------------------
1
2
SELECT *
FROM (
SELECT 1 AS FOO_ID FROM DUAL UNION SELECT 2 FROM DUAL UNION SELECT 3 FROM DUAL
) FOO
WHERE FOO_ID IN (
SELECT '1,2' AS FOO_ID FROM DUAL
);
SQL Error: ORA-01722: invalid number
Pouvez-vous afficher la définition de la table (en particulier les types de colonnes ID) pour les trois tables; et comment ': other_id' est défini?Il se peut que vous joigniez une colonne numérique à un varchar dont vous pensez qu'il ne contient que des nombres, ou seulement des correspondances sur des nombres, et que ce soit sur une valeur non numérique que vous ne pensez pas être pertinente. –
Je viens de remarquer que ma requête initiale était erronée. Je l'ai mis à jour. – Kel
Est-ce que 'person_ids' dans' other' est une liste séparée par des virgules? Si c'est le cas, cela ne fonctionnera pas dans une clause "IN". Vous devez analyser la chaîne dans une collection et utiliser la collection dans la requête. Mais vous ne devriez jamais stocker une liste de clés séparées par des virgules dans une base de données relationnelle, vous devez donc probablement corriger votre modèle de données. –