Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/01/2008, 01h37   #1
Invité régulier
 
Inscription : mars 2006
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 43
Points : 8
Points : 8
Par défaut Problème d'execution d'une fonction..

J'ai créé une fonction qui pprends 4 arguments char et retourner un char:
Citation:
CREATE FUNCTION test(arg1 char(255), arg2 char(255), arg3 char(255), arg4 char(255))
RETURNS char(255)
BEGIN
DECLARE val1, val2, val3, val4 INT;
SET val1 = ASCII(arg1);
SET val2 = ASCII(arg2);
SET val3 = ASCII(arg3);
SET val4 = ASCII(arg4);
IF (0 NOT IN (val1,val2,val3,val4)) AND (32 NOT IN (val1,val2,val3,val4)) THEN
RETURN CONCAT(CONCAT(arg1 , ' ', arg2),' - ',CONCAT(arg3 , ' ', arg4));
ELSEIF (0 NOT IN (val1,val2)) AND (32 NOT IN (val1,val2)) THEN
RETURN CONCAT(arg1 , ' ', arg2);
ELSE
RETURN 'rien';
END IF;
END;
La condition IF verifie si les champs sont vides ou contiennent un simple éspace...
avec la requète test suivante, tous marche bien:
Citation:
select test('18','ans','20','years');
==>18 ans - 20 years
mais quand je l'applique à mes champs de table, c'est le dernier else qui est exècuté bien que les champs contiennent les memes valeurs de la requete test:
Citation:
select test(tab.year1, tab.str1, tab.year2, tab.str2) from tab where tab.year1='18';
==> rien
Je ne comprends pas ce qui cloche ?
batis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2008, 19h26   #2
Membre éclairé
 
Avatar de jota5450
 
Jota Alves
Inscription : janvier 2006
Messages : 263
Détails du profil
Informations personnelles :
Nom : Jota Alves
Âge : 36

Informations forums :
Inscription : janvier 2006
Messages : 263
Points : 303
Points : 303
slt...

Juste pour info, chez moi ca passe sans probleme...

t´es sur que tab.year1 et que tab.str1 ne sont pas vides, ni qu´ils commencent par un espace?
jota5450 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 09h40   #3
Invité régulier
 
Inscription : mars 2006
Messages : 43
Détails du profil
Informations forums :
Inscription : mars 2006
Messages : 43
Points : 8
Points : 8
En fait ça marche manitenant et je n'ai aucune idée pourquoi ça déconait avant
J'aimerai maintenant tester si plusieurs variable sont NULL, j'ai éssayé de faire comme là haut:
Citation:
NULL NOT IN (arg1,arg2,arg3....,arg10)
mais ça ne marche pas, d'après mes recherches la seule façon de tester si null est d'utiliser IS NOT NULL ou NOT NULL ou encore la fonction ISNULL() qui retourne 1 si c'est la cas et 0 sinon, donc dans mon cas ce sera par exemple:
Citation:
(arg1 IS NOT NULL) AND (arg2 IS NOT NULL) AND (arg3 IS NOT NULL) ... AND (arg10 IS NOT NULL)
Ce qui sera lourd, je me demandais s'il n'y avait pas un autre moyen de faire?
batis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2008, 14h25   #4
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 422
Points : 6 422
Bonjour,
Tu peux utiliser la fonction COALESCE pour ça... Elle, elle prend plusieurs arguments (tous les arguments que tu veux) et renvoit le premier non NULL, et si ils sont tous NULL alors elle renvoit NULL.
Donc pour tester qu'il y a au moins un argument non null, ça donne :
Code :
...WHERE COALESCE(arg1,arg2,arg3....,arg10) IS NOT NULL
ced
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h24.


 
 
 
 
Partenaires

Hébergement Web