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 :-k

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 :?

Code : Tout sélectionner

SELECT * FROM goldbook WHERE `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

    Code : Tout sélectionner

    WHERE nom_colonne IS NULL

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

Code : Tout sélectionner

`avertissement` IS NULL
et

Code : Tout sélectionner

`avertissement` = 'wanted'
ne peuvent pas être vraies en même temps...

Posté : 28 juin 2007, 15:27
par zeus
Bien vu Sekiltoyai :pouce:

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

Code : Tout sélectionner

condition1 AND condition2
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