Bonjour,
Ce code ne fonctionne pas.Code:
1
2
3
4
5
6 IF( lieu_naissance <> NULL, CONCAT(DATE_FORMAT(date_naissance, '%d/%m/%Y'), ' à ', lieu_naissance), date_naissance ) as naissance
Merci d'avance pour votre aide...
Version imprimable
Bonjour,
Ce code ne fonctionne pas.Code:
1
2
3
4
5
6 IF( lieu_naissance <> NULL, CONCAT(DATE_FORMAT(date_naissance, '%d/%m/%Y'), ' à ', lieu_naissance), date_naissance ) as naissance
Merci d'avance pour votre aide...
Bonjour,
Qu'est-ce qui "ne fonctionne pas" ? Un message d'erreur ? Un résultat inattendu ?
Au passage, il faut remplacerparCode:<> NULL
Autre remarque, les 2 valeurs renvoyées par le IF sont de types différents : le premier est une chaîne de caractères et l'autre une date. Il faut que ce soit le même type (même si MySQL effectue des conversions de type implicites).Code:IS NOT NULL
ced
Modifiée ainsi, ca marche mais j'ai des résultats inattendus.Code:
1
2
3
4
5
6 IF( m.lieu_naissance IS NOT NULL, CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance), CAST(m.date_naissance AS CHAR) ) as Naissance
C'est un bon résultat.Citation:
06/01/1939 à Mbiane
Mais celui est mauvais, car je veux " à " uniquement quandCitation:
29/03/1945 à
Quelle est mon erreur?Code:m.lieu_naissance IS NOT NULL
Essaie plutôt avec un CASE :
Code:
1
2
3
4
5 CASE WHEN m.lieu_naissance IS NOT NULL THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
@CinePhil : merci, mais j'ai le même résultat. Je ne connais pas cette façon.
Si tu as 'une_date à' alors que la colonne m.lieu_naissance est bel et bien NULL, ce n'est pas logique !
Es-tu sûr que la colonne soit à NULL et non pas qu'elle contienne une chaîne vide ?
Si tu as certaines lignes avec des NULL et d'autres avec des chaînes vides, complète la condition :
Tu peux aussi mettre à jour les lignes qui ont une chaîne vide pour les mettre à NULL.Code:
1
2
3
4
5 CASE WHEN m.lieu_naissance IS NOT NULL OR m.lieu_naissance = '' THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
Quelqu'un pourrait m'expliquer cette syntaxe et comment ca fonctionne ? Est-ce je l'ai bien indenté ce code?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 CASE valeur WHEN [compare-value] THEN résultat [WHEN [compare-value] THEN résultat ...] [ELSE résultat] END, CASE WHEN [condition] THEN résultat [WHEN [condition] THEN résultat ...] [ELSE résultat] END
En fait tu as donné les deux syntaxes possibles. La seconde peut s'appliquer tout le temps, la première est plus limitée puisqu'elle ne teste qu'une expression.
1ère syntaxe :
Traduction :Code:
1
2
3
4
5 CASE valeur WHEN [compare-value] THEN résultat [WHEN [compare-value] THEN résultat ...] [ELSE résultat] END
Au cas ou l'expression "valeur" a la valeur "compare-value" alors la colonne retournée par la requête affiche la valeur "résultat". On peut répéter plusieurs WHEN. Si la "valeur" n'est égale à aucune "compare_value" alors (ELSE) la requête affiche le dernier résultat.
Exemple :
=> L'évaluation ne peut se faire que sur la colonne "sexe". (on écrit de ces trucs parfois ! :P :oops: )Code:
1
2
3
4
5 CASE sexe WHEN 1 THEN 'Homme' WHEN 2 THEN 'Femme' ELSE 'Inconnu' END
Seconde syntaxe :
C'est le même principe sauf que l'expression évaluée peut être différente à chaque WHEN.Code:
1
2
3
4
5 CASE WHEN [condition] THEN résultat [WHEN [condition] THEN résultat ...] [ELSE résultat] END
Le premier exemple peut ainsi s'écrire avec la seconde syntaxe :
Autre exemple où on affiche le nom du contact client s'il existe, à défaut le nom du directeur, à défaut "Néant".Code:
1
2
3
4
5 CASE WHEN sexe = 1 THEN 'Homme' WHEN sexe = 2 THEN 'Femme' ELSE 'Inconnu' ENDAS Sexe
=> On teste successivement les colonnes "contact" et "directeur".Code:
1
2
3
4
5 CASE WHEN contact IS NOT NULL THEN 'Contact : ' || p1.prs_nom || p1.prs_prenom WHEN dirigeant IS NOT NULL THEN 'Dirigeant : ' || p2.prs_nom || p2.prs_prenom ELSE 'Néant' END AS Contact_client
@CinePhil : Merci pour ces détails...
Que veut stipuler cette expression?Code:
1
2'Contact : ' || p1.prs_nom || p1.prs_prenom
Exactement le problème était à ce niveau.
Avec ce code le résultat est bon.:DCode:
1
2
3
4
5
6 CASE WHEN m.lieu_naissance <> '' THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
J'ai modifié tous les champs vide à 'NULL'
et code :Citation:
`lieu_naissance` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
me renvoie des résultats de ce genre pour des m.lieu_naissance = 'NULL' :Code:
1
2
3
4
5
6 CASE WHEN m.lieu_naissance IS NOT NULL THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
Je deviens fou. :cry:Citation:
29/03/1945 à NULL
La double barre verticale est l'opérateur normalisé pour la concaténation des chaînes de caractères en SQL. Ci-dessus on concatène donc la chaîne 'Contact : ' avec le nom et le prénom.
J'aurais d'ailleurs faire plutôt comme ci-dessous pour éviter de coller le nom et le prénom :
Code:
1
2 'Contact : ' || p1.prs_nom || ' ' || p1.prs_prenom
En faisant ça, tu as seulement imposé, si ce n'était pas déjà le cas, que la valeur par défaut pour la colonne 'lieu_naissance' des nouvelles lignes de la table soit à NULL.Citation:
J'ai modifié tous les champs vide à 'NULL'
Code:`lieu_naissance` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
Pour mettre toutes les chaînes vides existantes à NULL, il faut faire cette requête :
Code:
1
2
3 UPDATE ta_table SET lieu_naissance = NULL -- seul cas où on peut écrire "= NULL" ! WHERE lieu_naissance = ''
Comme je l'ai indiqué dans ma requête juste au dessus, le seul cas où on peut écrire "= NULL" est dans une requête UPDATE. Sinon il faut employer IS NULL ou IS NOT NULL car NULL est un marqueur qui n'est égal à rien, pas même à NULL ; ce n'est pas une valeur.Citation:
me renvoie des résultats de ce genre pour des m.lieu_naissance = 'NULL' :
Citation:
29/03/1945 à NULL
Si tu obtiens de tels résultats, c'est sans doute que maintenant tu as des lieu_naissance dont la valeur est la chaîne de caractères 'NULL' ?
Voici à propos mon code avec IS NOT NULL :
Mais pourquoi encore ce résultat :Code:
1
2
3
4
5
6 CASE WHEN m.lieu_naissance IS NOT NULL THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
Merci d'avance...Citation:
12/04/1973 à NULL
Le code ci-dessus me donne des bons résultats. Est-ce le fait de remplir les lieux de naissance de cette manière était une mauvaise approche :Code:
1
2
3
4
5
6 CASE WHEN m.lieu_naissance <> 'NULL' THEN CONCAT(CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR), ' à ', m.lieu_naissance) ELSE CAST(DATE_FORMAT(m.date_naissance, '%d/%m/%Y') AS CHAR) END AS Naissance
Merci d'avance...Code:
1
2
3
4 UPDATE ta_table SET lieu_naissance = 'NULL' WHERE lieu_naissance = ''
La réponse à ta question est là :
Que donne la requête suivante ?Citation:
Si tu obtiens de tels résultats, c'est sans doute que maintenant tu as des lieu_naissance dont la valeur est la chaîne de caractères 'NULL' ?
Code:
1
2
3 SELECT * FROM ta_table WHERE lieu_naissance = 'NULL'
Tu as posté ton second message à 15h49 et ma réponse est venue à 15h50 donc effectivement, je n'avais pas pu voir ton message.
Oui, ce n'est pas la chaîne de caractères 'NULL' mais le marqueur NULL sans apostrophes qu'il faut utiliser !Citation:
Le code ci-dessus me donne des bons résultats. Est-ce le fait de remplir les lieux de naissance de cette manière était une mauvaise approche :
Code:
1
2
3 UPDATE ta_table SET lieu_naissance = 'NULL' WHERE lieu_naissance = ''
Regarde la différence dans la coloration syntaxique avec cette requête qui est la bonne :
Donc maintenant que tu as des valeurs 'NULL' il faut aussi faire cette mise à jour :Code:
1
2
3 UPDATE ta_table SET lieu_naissance = NULL WHERE lieu_naissance = ''
Code:
1
2
3 UPDATE ta_table SET lieu_naissance = NULL WHERE lieu_naissance = 'NULL'
Pour l'objet de ce post ca va, mais je souhaite quelques éclaircis sur :
Quelle différence avec le "CONCAT"?Code:
1
2 'Contact : ' || p1.prs_nom || ' ' || p1.prs_prenom
Merci d'avance...
Comme dit plus haut, la double barre verticale est l'opérateur standard en SQL pour concaténer les chaînes de caractères mais je crois que MySQL ne le connait pas et qu'il a implémenté CONCAT à la place.