Vous n'êtes pas identifié(e).

#1 22/01/2019 17:18:03

Mlan2
Membre

Question sur l'utilisation d'une fonction dans requête de type SELECT

Bonjour à tous,

Je m'étonne du comportement d'une requête utilisant une fonction comme critère de sélection.

La fonction utilisée fait le contrôle d'une chaîne date passée en paramètre, et restitue TRUE si la date est correcte ou FALSE dans le cas contraire.

Utilisée dans la requête ci-dessous, celle-ci retourne un bon résultat selon la valeur du paramètre passé.

select is_date ('');
 is_date
---------
 f
(1 ligne)

select is_date (' ');
 is_date
---------
 f
(1 ligne)

select is_date ('20190121');
 is_date
---------
 t
(1 ligne)

La date passée en paramètre est attendue au format : YYYYMMDD

Utilisée dans une clause Where d'une requête de type SELECT, la fonction ne semble pas retourner le même résultat.

Ci-dessous, la requête utilisée :

SELECT C.DAT
  FROM MA_TABLE C
 WHERE NOT IS_DATE (C.DAT);

 dat
-----
(0 ligne)

La table MA_TABLE comporte un champ DAT de type chaîne de caractères qui n'est pas toujours renseigné ou ne correspond pas à une date au format : YYYYMMDD.

La requête me retourne 0 lignes, malgré le champ DAT ayant un contenu incorrect, comme si le code de la fonction renvoyait toujours TRUE, ce qui n'est pas le  cas.

Ci-dessous, le code de la fonction utilisée :

CREATE OR REPLACE  FUNCTION IS_DATE (P_VAR  VARCHAR)
RETURNS BOOLEAN
AS $$ 
DECLARE
  V_Dat DATE;

BEGIN

  V_Dat := TO_DATE (P_VAR, 'YYYYMMDD');

  RETURN TO_CHAR (V_Dat, 'YYYYMMDD') = P_VAR;

  EXCEPTION
    WHEN OTHERS THEN
    RETURN FALSE;
END;
$$ LANGUAGE plpgsql;

D'avance merci de votre retour pour tout éclairage sur le sujet.

Cordialement.

Hors ligne

#2 22/01/2019 20:03:05

dverite
Membre

Re : Question sur l'utilisation d'une fonction dans requête de type SELECT

WHERE not null élimine la ligne donc "non renseigné" n'est pas compté dans la requête.
Pour des valeurs non nulles mais au mauvais format je ne vois pas, mais des exemples pourraient éclairer.

Hors ligne

#3 23/01/2019 09:18:01

Mlan2
Membre

Re : Question sur l'utilisation d'une fonction dans requête de type SELECT

Merci du retour,

Je viens de trouver l'explication au problème.
Il s'agit de la présence de valeurs nulles qui rendent le résultat du test incorrect.
J'ai résolu le problème en utilisant la fonction COALESCE appliquée à la valeur passée en paramètre.

Hors ligne

Pied de page des forums