Acess et champ NULL - SQL/NoSQL - Programmation
Marsh Posté le 23-03-2006 à 13:25:06
Il existe plusieurs moyens pour faire cela.
Personnellement, j'utiliserais la fonction Nz(), qui retourne le second paramètre dans le cas d'une donnée nulle :
SELECT prénom |
Marsh Posté le 23-03-2006 à 13:49:43
merci , et sur des SGBD utilisant le SQL standard ma requête aurait marchée ou pas ?
Marsh Posté le 23-03-2006 à 15:52:30
non : "" (vide) n'est pas la même chose que NULL ce sont 2 valeurs différentes.
Marsh Posté le 23-03-2006 à 15:53:32
Sur Oracle par exemple, faut voir pour les autres, faut utiliser IS NULL
Code :
|
Edit: Ca fonctionne d'ailleurs aussi avec Access
Marsh Posté le 23-03-2006 à 17:14:05
Sous Oracle, la fonction qui ressemble le plus à Nz() est NVL().
Marsh Posté le 23-03-2006 à 19:45:21
donc en SQL le concept de chaine vide n'existe pas, c'est soit null ou pas null.
c'est ça ?
Marsh Posté le 23-03-2006 à 19:47:14
ReplyMarsh Posté le 23-03-2006 à 23:36:15
Citation : pourquoi est ce ="" ne marche pas? |
Les champs, pouvant avoir une valeur nulle, ont un petit drapeau associé qui indique si le champ est nul ou pas. En théorie, une donnée ayant le drapeau mis à nul peut avoir un contenu quelconque, car un SGBD peut juste changer le drapeau sans changer le contenu quand l'utilisateur fait un update tb1 set champ1 = null. Ne mettre à jour que le drapeau sans remettre à vide le champ fait gagner quelques fractions de pouillième de seconde.
Le concept de chaine vide existe aussi, mais un champ vide n'est pas forcément nul et inversement.
Donc, dans la plupart des cas, il faut tester à la fois si le champ est null et s'il est vide, avec les moyens montrés dans les autres messages ci-dessus.
Marsh Posté le 24-03-2006 à 10:56:16
weblook$$ a écrit : enfin pourquoi est ce ="" ne marche pas? |
Parce que NULL est différent de ""
Marsh Posté le 24-03-2006 à 13:45:31
olivthill a écrit :
|
exactement ce que je voulais savoir merci
Marsh Posté le 24-03-2006 à 14:16:47
j'ai crée deux cas
quand j'éxécute cette requête :
SELECT nom FROM Table1 WHERE nz(prenom,"" )="" And prenom Is Not Null
ça me retourne rien, alors que je m'attendais à ce que me retourne la ligne dans laquelle je n'ai pas mis le champ à null (deuxième cas décrit)
why?
Marsh Posté le 24-03-2006 à 14:30:40
dans ta requete tu ne prends pas en compte le champ ""
nz(prenom,"" )="" te permet de transformer NULL en ""
donc nz(prenom,"" )="" est equivalent à IS NULL
ta requete doit devenir :
SELECT nom FROM Table1 WHERE prenom="" And prenom Is Not Null
mais à mon avis, And prenom Is Not Null ne sert à rien ici la première condition suffit.
Marsh Posté le 24-03-2006 à 15:10:26
non justement SELECT nom FROM Table1 WHERE prenom="" ne me renvoie rien
Marsh Posté le 24-03-2006 à 15:20:33
SELECT nom FROM Table1 WHERE prenom is null
ca te renvoie qqchose ?
Marsh Posté le 24-03-2006 à 15:23:47
je pense à un truc là, champs vide c'est pas "" mais '' (l'apostrophe)
Cette requete là ca donne quoi ?
SELECT nom FROM Table1 WHERE prenom=''
Marsh Posté le 24-03-2006 à 15:30:11
je pense aussi que quand tu vides un champ il le met à NULL et pas à ''.
Marsh Posté le 24-03-2006 à 15:37:26
SELECT nom FROM Table1 WHERE prenom='' ne marche pas , Access me signale une erreur de syntaxe
Marsh Posté le 24-03-2006 à 15:38:21
et SELECT nom FROM Table1 WHERE prenom is null , ça marche
Marsh Posté le 24-03-2006 à 15:40:07
bref je suis toujours pas ok pour la distinction entre NULL interdit: NON
/OUI et chaine vide autorisé: OUI/NON , lors de la création d'une table sous Acces
Marsh Posté le 24-03-2006 à 16:02:24
attention, j'ai vu des accents dans ton message initial (prénom) puis plus d'accents après (prenom).
Marsh Posté le 24-03-2006 à 16:24:01
oui c'était juste des exemples , le problème ne vient pas delà, merci tout de même
Marsh Posté le 23-03-2006 à 11:16:41
j'ai une table définit ainsi
NULL interdit: NON
chain vide autorisé: OUI
les structure et les données de cette table sont :
numéro prénom nom
1 h t
2 g
3 v d
je voudrais écrire une requête qui me sélectionne les prénoms dont le nom est vide/null
je pensais à ça :
select prénom from table1 where nom=""
mais ça ne me renvoie rien.
d'autres idées ?
merci