Acess et champ NULL

Acess et champ NULL - SQL/NoSQL - Programmation

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

Reply

Marsh Posté le 23-03-2006 à 11:16:41   

Reply

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
  FROM table1
 WHERE Nz(nom, "" ) = ""


Reply

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 ?

Reply

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.

Reply

Marsh Posté le 23-03-2006 à 15:53:32    

Sur Oracle par exemple, faut voir pour les autres, faut utiliser IS NULL
 

Code :
  1. SELECT prénom  FROM table1
  2. WHERE nom IS NULL


 
Edit: Ca fonctionne d'ailleurs aussi avec Access


Message édité par dlaumor le 23-03-2006 à 15:56:16
Reply

Marsh Posté le 23-03-2006 à 17:14:05    

Sous Oracle, la fonction qui ressemble le plus à Nz() est NVL().

Reply

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 ?

Reply

Marsh Posté le 23-03-2006 à 19:47:14    

enfin pourquoi est ce ="" ne marche pas?
je pige pas

Reply

Marsh 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.

Reply

Marsh Posté le 24-03-2006 à 10:56:16    

weblook$$ a écrit :

enfin pourquoi est ce ="" ne marche pas?
je pige pas


 
 
Parce que NULL est différent de ""

Reply

Marsh Posté le 24-03-2006 à 10:56:16   

Reply

Marsh Posté le 24-03-2006 à 13:45:31    

olivthill a écrit :

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.


 
exactement ce que je voulais savoir merci

Reply

Marsh Posté le 24-03-2006 à 14:16:47    

j'ai crée deux cas
 

  • prenom = "" et update pour mettre le drapeau à null

  • prenom = "" et pas d'update


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?

Reply

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.


Message édité par dlaumor le 24-03-2006 à 14:31:48
Reply

Marsh Posté le 24-03-2006 à 15:10:26    

non justement SELECT nom FROM Table1 WHERE prenom="" ne me renvoie rien

Reply

Marsh Posté le 24-03-2006 à 15:15:06    

y'a un truc qui n'est toujours pas clair

Reply

Marsh Posté le 24-03-2006 à 15:15:20    

moi je suis embrouillé là

Reply

Marsh Posté le 24-03-2006 à 15:20:33    

SELECT nom FROM Table1 WHERE prenom is null
 
ca te renvoie qqchose ?

Reply

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=''

Reply

Marsh Posté le 24-03-2006 à 15:30:11    

je pense aussi que quand tu vides un champ il le met à NULL et pas à ''.

Reply

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

Reply

Marsh Posté le 24-03-2006 à 15:38:21    

et SELECT nom FROM Table1 WHERE prenom is null , ça marche

Reply

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

Reply

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).

Reply

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed