Poser votre question
0

BASE Wrong data type in CASE WHEN ELSE (RESOLU)

posée 2019-12-24 19:02:53 +0200

Image Gravatar de mgl

updated 2019-12-27 12:25:40 +0200

Bonsoir, Je souhaite de réaliser une division si le dénominateur est non nul. Je tente une forme du genre

CASE WHEN dénominateur IS NULL THEN '' ELSE numérateur / dénominateur END

et j'obtiens une erreur Wrong data type: java.lang.NumberFormatException in statement

  • numérateur et dénominateur sont du type DECIMAL(100,2)

  • les deux simplifications de la requête ci-dessus fonctionnent bien, que ce soit

SELECT CASE WHEN dénominateur IS NULL THEN '' ELSE 'Toto' END

ou SELECT numérateur / dénominateur

Merci d'avance pour votre aide.

EDITION du 27/12 :

Bonjour,

Merci Sébastien, remplacer THEN '' par THEN NULL fonctionne, sans que je comprenne pourquoi.

Merci Pierre-Yves. Remplacer THEN "" par THEN 'vide' provoque l'erreur Wrong data type: java.lang.NumberFormatException: Character v is neither a decimal digit number, decimal point, nor "e" notation exponential mark. in statement [SELECT... Ceci explique peut-être pourquoi remplacer THEN '' par THEN NULL fonctionne : CASE demanderait à conserver le même type de donnée pour les valeurs de sortie que celui des données d'entrée. Ici numérateur est un nombre donc demander une chaîne vide en résultat du CASE provoquerait l'erreur.

Distinguer le cas où numérateur est non renseigné de celui où il est nul n'aide pas.

Merci encore à tous les deux. Cordialement Michel

éditer requalifier signaler fermer fusionner supprimer

Commentaires

À mon avis, le fait de mélanger des données numériques et des chaînes de caractères n'est pas du goût de Base.

Image Gravatar de sebastienadamsebastienadam ( 2019-12-28 00:03:41 +0200 )éditer

@mgl a écrit: Remplacer THEN "" par THEN 'vide' provoque l'erreur

Naturellement, c'est un texte... juste un peu plus long. Mais ce n'était pas ce que je proposais, relis ma proposition où le CASE incluait deux WHEN : vide et zéro n'étaient là que pour illustrer la différence entre les deux. Ma solution était

CASE when "dénominateur" = 0 then '' else "numérateur" / "dénominateur" END

@sebastienadam il est tout à fait possible de mélanger cf. copie d'écran ajouté à ma réponse

Cordialement

Image Gravatar de pierre-yves samynpierre-yves samyn ( 2019-12-28 07:43:06 +0200 )éditer

2Réponses

1

répondue 2019-12-25 15:17:49 +0200

Essaie:

CASE WHEN dénominateur IS NULL THEN NULL ELSE (numérateur / dénominateur) END
éditer signaler supprimer permalien plus
0

répondue 2019-12-25 15:23:58 +0200

Image Gravatar de pierre-yves samyn

updated 2019-12-28 07:44:34 +0200

Bonjour

Sans voir les données, une hypothèse pourrait être que certains dénominateurs sont à 0, ce qui est différent de vide (NULL). Ce qui suit fonctionne par exemple dans mon environnement :

SELECT "dénominateur", "numérateur", CASE WHEN "dénominateur" IS NULL THEN 'vide' WHEN "dénominateur" = 0 THEN 'zero' ELSE "numérateur" / "dénominateur" END FROM "Contacts"

Avec des champs de type DECIMAL on peut en principe réduire le test avec par exemple :

SELECT "dénominateur", "numérateur",  CASE when "dénominateur" = 0 then 'zero' else "numérateur" / "dénominateur" END FROM "Contacts"

Une autre manière d'éviter les erreurs :

SELECT "dénominateur", "numérateur", "numérateur" / "dénominateur" FROM "Contacts" WHERE "dénominateur" <> 0

Mais naturellement cela ne produit pas le même résultat puisque la sélection est filtrée...

[Ajout 28-12-2019 07:30]

description de l'image

Cordialement

éditer signaler supprimer permalien plus
S'identifier/S'inscrire pour répondre

Outils de question

1 suiveurs

Stats

Posée: 2019-12-24 19:02:53 +0200

Consultée: 71 fois

Mise à jour: Dec 28 '19