Page 1 sur 2
probleme de requete sql et champs de valeur null...
Posté : 27 juin 2007, 11:23
par BeRoots
salut à tous
je ne comprend pas pourquoi, mais la requete suivante ne me détecte pas les champs
avertissement égal à NULL et pourtant il detecte les champs
avertissent égal à WANTED et dont le ticket_xhtml est egal à NULL
Code : Tout sélectionner
SELECT COUNT(*) FROM goldbook WHERE `avertissement` = 'null' OR `avertissement` = 'wanted' AND `ticket_xhtml` != 'null'
si quelqu'un peut me dire pourquoi j'arrive pas à retourner de valeur pour les champs
avertissement égal à NULL ?
merci d'avance

Posté : 27 juin 2007, 12:36
par zeus
a mon avis, c'est une question de parenthèses.
si ton test c'est
soit
avertissement = NULL
ou
avertissement = wanted et ticket_xhtml = null
j'aurais écrit ton test comme suit :
Code : Tout sélectionner
SELECT COUNT(*) FROM goldbook WHERE (`avertissement` = 'null') OR (`avertissement` = 'wanted' AND `ticket_xhtml` != 'null')
Posté : 27 juin 2007, 22:23
par BeRoots
en faite même si je fait simplement comme suit, je n'arrive pas à selectionner l'enregistrement correspondant à avertissement = NULL
rien n'est retourner bien que j'ai un enregistrement dont avertissement = NULL dans ma table ;?
voici la requete de création de ma table
Code : Tout sélectionner
CREATE TABLE table_goldbook(
id int UNSIGNED AUTO_INCREMENT,
pseudo VARCHAR(20) NOT NULL,
avertissement CHAR(6) DEFAULT NULL,
ticket_xhtml TEXT(65535) DEFAULT NULL,
post_date date NOT NULL,
PRIMARY KEY (id)
)
TYPE = MYISAM CHARACTER SET latin1 COLLATE latin1_general_cs;
si qq1 à une idée

Posté : 27 juin 2007, 22:33
par Jules Petibidon
hello,
si ton champ déclare les NULL, tu as la fonction ISNULL( le_champ_en_question )
Posté : 27 juin 2007, 22:46
par BeRoots
le truc c'est que cela me detecte les champs `ticket_xhtml` = 'null' mais pas les `avertissement` = 'null'
je comprend pas
idem voir pir avec ISNULL(nom_du_champ)
si quelqu'un à une idée sur ce soucis

Posté : 27 juin 2007, 23:23
par AB
Et si tu enlèves les ` c'est pareil?
Posté : 27 juin 2007, 23:31
par Hubert Roksor
J'aimerais corriger le malentendu sur NULL/'null'/ISNULL()
- 'null' est une chaîne de caractère
- NULL (sans les guillemets) est la valeur NULL (peu importe la casse)
- si vous voulez vérifier que quelque chose est NULL, utilisez plutôt la forme
Posté : 28 juin 2007, 10:43
par BeRoots
OK j'ai fait comme suit pour recuperer touts les enregistrements dont avertissement et soit null soit egal à wanted avec ticket_xhtml à null.
Code : Tout sélectionner
SELECT *
FROM table_goldbook
WHERE `avertissement` IS NULL
AND (
`avertissement` = 'wanted'
AND `ticket_xhtml` IS NULL
)
rien n'est retourner
si quelqu'un peut m'aider

Posté : 28 juin 2007, 12:20
par zeus
Comme tu as du le voir quand tu as posté ton message, il nous faudrait un échantillon de tes données

Posté : 28 juin 2007, 14:24
par Sékiltoyai
Code : Tout sélectionner
WHERE `avertissement` IS NULL
AND (
`avertissement` = 'wanted'
AND `ticket_xhtml` IS NULL
)
Les conditions
et
ne peuvent pas être vraies en même temps...
Posté : 28 juin 2007, 15:27
par zeus
Bien vu
Sekiltoyai
Il y a un OR qui est devenu un AND pendant la remise en forme

Posté : 28 juin 2007, 22:29
par BeRoots
mon truc c'est que je veut recuperer les enregistrements dont avertissement = null et aussi ceux dont avertissement = wanted et dont le champ ticket_xhtml != null
si quelqu'un a une idée a me proposer

Posté : 28 juin 2007, 23:32
par zeus
Tu veux récupérer les enregistrements qui satisfont
condition1 plus ceux qui satisfont
condition2.
Si tu écrit
tu auras l'intersection des 2 conditions, c'est à dire les enregistrements qui satisfont
condition1 et condition2
Toi, tu désires l'addition des 2 conditions, soit les enregistrements qui satisfont
condition1 ou condition2
Posté : 29 juin 2007, 01:10
par Hubert Roksor
Je me suis permis de remplacer "et" par "plus", qui a l'avantage d'être sémantiquement correct tout en évitant tout risque de confusion avec l'opérateur booléen "et"

Posté : 29 juin 2007, 07:42
par zeus
Effectivement, c'est plus clair.
J'ai pourtant essayé de le tourner dans tout les sens pour le rendre plus clair, mais j'avais pas trouvé.
Merci Hubert