Partage
  • Partager sur Facebook
  • Partager sur Twitter

[PostgreSQL] detecter un champ vide

Sujet résolu
29 mars 2008 à 23:22:25

Bonjour
Je possède une base de donnée dans laquelle un attribut peut ne pas être remplit. Je souhaiterais savoir comment tester s'il est remplit ou pas dans une clause WHERE

un truc du genre :
  1. SELECT * FROM TABLE WHERE attribut=''

ou bien attribut=NULL
ou un truc dans le genre.

Merci
  • Partager sur Facebook
  • Partager sur Twitter
29 mars 2008 à 23:29:38

utilise IS NULL, exemple :
  1. SELECT * FROM photos WHERE "thumbnail" IS NULL


Zieute un peut la documentation pour plus d'info sur les comparaisons :
http://docs.postgresqlfr.org/8.3/functions-comparison.html

Citation : Documentation

On ne peut pas écrire expression = NULL parce que NULL n'est pas « égal à » NULL (la valeur NULL représente une valeur inconnue et il est impossible de dire si deux valeurs inconnues sont égales). Ce comportement est conforme au standard SQL.

  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2008 à 0:31:09

Merci pour l'info
J'ai encore une question, un peu du même style.

Mon attribut est de type DATE, et comme il n'est pas obligatoirement remplit, je décide d'insérer une ligne où je ne remplit pas ce champ.

Ma ligne a cette forme, le champ en question est le second dans mon exemple (je ne le remplit pas) :
  1. INSERT INTO TABLE VALUES (attribut1,,attribut3)


puisque je décide de ne pas remplire le second attribut, je ne met rien entre les deux virgules.
Or, on me répond syntax error
Si je met une chaine de caractère vide '' entre les deux virgules, on me dit invalide input syntaxe pour le type DATE.

Comment celà se fait-il qu'il me jette lorsque je ne remplit pas un champ? La date null est-elle représenté par une chaine particulière?
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2008 à 0:36:23

soit tu ne selectionne que les colonnes que tu veut remplir dans l'insert :
  1. INSERT INTO TABLE(colonne1,colonne3) VALUES (attribut1,attribut3)

ou tu utilise DEFAULT la ou tu veut mettre la valeur par defaut :
  1. INSERT INTO TABLE VALUES (attribut1,DEFAULT,attribut3)

je crois que la premiere solution est plus performante
mais tu doit avoir definie une valeur par defaut pour le champ si tu utilise DEFAULT
pour la date , tu peut aussi mettre NOW() si tu veut la date de l'insertion
  1. INSERT INTO TABLE VALUES (attribut1,NOW(),attribut3)
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2008 à 0:50:27

merci, effectivement, ça marche

mais alors, celà me pose un problème car pour créer mes tables, j'utilise un fichier .sql dans lequel je cré ma table, et ensuite je la charge à partir d'un fichier en utilisant la ligne suivante
  1. \copy TABLE FROM 'Table.dat' USING delimiters ','


Table.dat a la syntaxe suivante :

attribut1,attribut2,attribut3
attribut1,attribut2,attribut3
attribut1,,attribut3

et au chargement, j'ai une erreur à la troisieme ligne, car je n'ai rien mis entre les deux virgules. Ce qui est normal puisque j'ai envie de laisser ce champ vide. (Je précise que ce champ n'est pas déclaré NOT NULL a la crétion de la table).

Ma question est donc : comment spécifier que je ne souhaite pas remplir ce champ, dans le fichier Table.dat?
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2008 à 12:42:41

D'apres la syntax de la commande copy :
  1. COPY tablename [ ( COLUMN [, ...] ) ]
  2.     FROM { 'filename' | STDIN }
  3.     [ [ WITH ]
  4.           [ BINARY ]
  5.           [ OIDS ]
  6.           [ DELIMITER [ AS ] 'delimiter' ]
  7.           [ NULL [ AS ] 'null string' ]
  8.           [ CSV [ HEADER ]
  9.                 [ QUOTE [ AS ] 'quote' ]
  10.                 [ ESCAPE [ AS ] 'escape' ]
  11.                 [ FORCE NOT NULL COLUMN [, ...] ]

je ne sait pas si on peut quand il n'y a rien pour specifier un champ vide , mais tu peut toujours essayer ca :
  1. COPY TABLE FROM 'Table.dat' WITH DELIMITER AS ',' NULL AS ''

ou alors si ca ne fonctionne pas , met NULL dans des champs vide et fait comme ca :
  1. COPY TABLE FROM 'Table.dat' WITH DELIMITER AS ',' NULL AS 'NULL'
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2008 à 21:21:46

effectivement

  1. \copy Catalogue FROM 'Catalogue1.dat' USING delimiters ',' NULL AS ''

Ca marche niquel
merci
  • Partager sur Facebook
  • Partager sur Twitter
3 août 2018 à 10:00:38

Bonjour à tous,

ma question est à peu près la même,

Sauf pour moi, je dois vérifier que les champs obligatoires sont bien remplis.

Donc, j'ai fait une fonction : CREATE TABLE IF NOT EXISTS (les_champs) pour pouvoir comparer à la base si ces champs indiqués sont bien renseignés ?

Merci d'avance !

  • Partager sur Facebook
  • Partager sur Twitter
3 août 2018 à 11:07:55

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. Me contacter par MP si besoin.

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)