PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 14/12/2009 16:49:05

will
Membre

Recherche portant sur un Integer potentiellement nul

Bonjour,

Désolé pour cette question exceptionnellement basique ... mais là je bloque.

En fait j'essaie de mettre en place un formulaire de recherche portant sur différents projets stockés dans une base. Parmi les champs recherchés, il y en a de type "Integer". Comment dans ce cas faire une recherche portant sur "tous les projets" ?

Pour l'instant, j'ai  inséré dans mon select (en php) une option dont la valeur est nulle, mais j'ai l'erreur suivante :

Warning: pg_query() [function.pg-query]: Query failed: ERREUR: syntaxe en entrée invalide pour l'entier : « »

En résumé, j'aimerais faire un select qui me renvoie toutes les lignes d'une table quelle que soit la valeur d'un champ de type Integer. Mais quelle syntaxe utiliser ? SELECT * WHERE mon_champ_integer ='ANY' ? ='%' ? J'ai l'impression qu'il n'accepte pas que ce champ integer soit nul.

Désolé si ma question n'est pas claire ou trop évidente... et merci beaucoup d'avance.

will

Hors ligne

#2 14/12/2009 17:22:16

gleu
Administrateur

Re : Recherche portant sur un Integer potentiellement nul

Si vous voulez récupérer toutes les lignes dont la colonne vaut NULL, il faut faire :

SELECT * WHERE mon_champ_integer IS NULL

Guillaume.

Hors ligne

#3 14/12/2009 17:46:20

FNo
Membre

Re : Recherche portant sur un Integer potentiellement nul

Bonjour,
   Si vous désirez récupérer tous les champs sans qu'une couche logicielle râle,  vous pouvez , peut-être, essayer de remplacer la valeur NULL par une autre :

select case when mon_champ is null then 0 else mon_champ end .....

Sinon , pouvez-vous nous communiquer votre requête initiale?

Hors ligne

#4 14/12/2009 17:59:04

will
Membre

Re : Recherche portant sur un Integer potentiellement nul

Bonjour,

Merci beaucoup pour cette réponse, mais ça n'est pas exactement ce que j'attendais.

L'intitulé de mon post prête à confusion ...

En fait je voudrais récupérer toutes les lignes quelle que soit la valeur de la ou des colonnes (qui sont de type integer). Pour l'instant, la requê(te

SELECT * FROM matable WHERE mon_champ_integer = ' '

me renvoie l'erreur indiquée précédemment.

J'ai trouvé une solution un peu tirée par les cheveux en php :

if( $mon_champ == ''){
$Rmon_champ = 'mon_champ IS NOT NULL';}
else { $Rmon_champ = 'mon_champ='.$mon_champ.'';}

puis je fais une requête du type

SELECT * FROM matable WHERE $Rmon_champ

En effet, ma base est interfacée en php et j'ai fait un maximum de listes déroulantes pour mes différents champs de recherche.

Je ne sais pas si c'est plus clair, j'avoue que ma question n'est pas évidente à expliciter ...

@FNo : c'est un peu ça, oui, sauf que la valeur zéro est déjà une valeur particulière de mon champ. En fait, pour expliciter mon problème, voici un exemple :

Dans ma table "projet",  j'ai créé un champ "responsable" de type integer qui fait référence au champ "id_responsable" de la table "responsable" (dans laquelle j'ai un champ "nom_responsable" de type varchar). J'effectue mes recherches sur le champ "responsable" de ma table projet, j'ai donc besoin dans certains cas de trouver tous les projets quel que soit le nom du responsable, ce que je dois traduire en SQL par "quelle que soit la valeur de l'integer 'responsable' "

J'ai bien peur de devoir reprendre mes cours sur les bases de données en commençant par les bases :-(

Merci encore.

will

Hors ligne

#5 14/12/2009 18:30:17

gleu
Administrateur

Re : Recherche portant sur un Integer potentiellement nul

Pour l'instant, la requête SELECT * FROM matable WHERE mon_champ_integer = ' ' me renvoie l'erreur indiquée précédemment.

Normal, la colonne est de type entier, et vous cherchez à faire une égalité avec une chaîne.

J'ai trouvé une solution un peu tirée par les cheveux en php

À priori, c'est la bonne réponse. Quoique j'aurais plutôt tendance à faire ceci :

if( $mon_champ != '')
  $Rmon_champ = 'mon_champ='.$mon_champ.'';

À quoi correspond la valeur 0 ?


Guillaume.

Hors ligne

#6 14/12/2009 18:51:21

will
Membre

Re : Recherche portant sur un Integer potentiellement nul

Ok, je ne pensais pas que la valeur nulle était considérée comme une chaine (comme quoi, il faut vraiment que je révise ;-)

Merci pour la solution plus élégante en php ...

Quant à la valeur 0, elle n'existe effectivement pas dans ma table, je vais donc tenter de voir ce que ça donne avec ça !

Encore merci beaucoup pour votre aide.

Hors ligne

#7 14/12/2009 18:56:21

will
Membre

Re : Recherche portant sur un Integer potentiellement nul

En utilisant la valeur 0, je n'obtiens aucun résultat ... puisqu'aucun de mes projets n'a de valeur zéro pour le champ considéré ...

Hors ligne

#8 14/12/2009 20:04:40

FNo
Membre

Re : Recherche portant sur un Integer potentiellement nul

Dans mon exemple, vous pouvez remplacer la valeur 0 par n'importe quoi. Mais au-delà de ceci, que ce soit en php ou en sql, il y a un problème de cohérence dans votre base (ou dans ma tête). Comment peut-il y avoir des projets sans responsable? Ou si cela doit se faire (valeur null), ne serait-ce pas une union entre les projets avec et les projets sans?

Hors ligne

#9 14/12/2009 21:12:10

gleu
Administrateur

Re : Recherche portant sur un Integer potentiellement nul

Ok, je ne pensais pas que la valeur nulle était considérée comme une chaine (comme quoi, il faut vraiment que je révise ;-)

Bin, justement, elle ne l'est pas pour PostgreSQL. D'pù le fait qu'il faut faire « IS NULL » pour tester une valeur NULL et = (ou autre opérateur) pour les valeurs. PHP et PostgreSQL sont deux choses différentes.


Guillaume.

Hors ligne

#10 15/12/2009 19:53:41

will
Membre

Re : Recherche portant sur un Integer potentiellement nul

Bonjour,

Merci pour ces détails.

@FNo : A priori il n'y aura pas de projet sans responsable ... En revanche, je veux être sûr de renvoyer la liste de tous les priojets à l'utilisateur qui ne renseigne pas le champ "responsable" dans le formulaire de recherche. Ceci m'oblige à trouver une condition qui soit vraie pour un champ de type integer. Apparemment la condition IS NOT NULL semble convenir mais je pensais trouver un truc plus simple ...

@gleu : Je ne pense pas faire d'amalgame entre php et postgres, mais j'avoue que je ne pensais pas devoir "bricoler en php" pour contourner ce "problèm"e en SQL.

Merci encore

Hors ligne

Pied de page des forums