Partage
  • Partager sur Facebook
  • Partager sur Twitter

Postgresql, le != ne prend pas les NULL

PostgreSQL 11.2

Sujet résolu
    15 juillet 2019 à 13:53:50

    Bonjour, je ne sais pas si c'est un comportement normal de PostgreSQL mais ceci m'a surpris. Le champ res_model est de type character varying.

    copyprod=> SELECT COUNT(id) FROM ir_attachment;
     count 
    -------
     18396
    (1 ligne)
    
    copyprod=> SELECT COUNT(id) FROM ir_attachment WHERE res_model = 'ir.ui.view';
     count 
    -------
        17
    (1 ligne)
    
    copyprod=> SELECT COUNT(id) FROM ir_attachment WHERE res_model != 'ir.ui.view';
     count 
    -------
     17726
    (1 ligne)
    


    Sauf que 17726 + 17 ça ne fait pas 18396. En fait ça ne prend pas les lignes où res_model = NULL :

    copyprod=> SELECT COUNT(id) FROM ir_attachment WHERE res_model IS NULL;
     count 
    -------
       653
    (1 ligne)
    

    17726 + 17 + 653 = 18396 là ok.

    Est-ce un comportement normal de postgresql ou du sql en général ?

    Et du coup y a-t-il plus simple que de faire ceci ?

    SELECT COUNT(id) FROM ir_attachment WHERE res_model != 'ir.ui.view' OR res_model IS NULL



    -
    Edité par thelinekioubeur 15 juillet 2019 à 13:54:15

    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2019 à 17:32:43

      Avec MySQL (mais peut-être pas que), l'opérateur <=> permet de tester une égalité et renvoie TRUE si l'un des deux termes est NULL.
      Par contre je ne connais pas d'équivalent pour l'opérateur !=.

      Essaye peut-être simplement

      SELECT COUNT(id) FROM ir_attachment WHERE NOT res_model <=> 'ir.ui.view';
      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2019 à 17:41:00

        Merci pour ta réponse mais <=> n'existe pas en postgresql.

        On a "<>" mais c'est équivalent à "!=".

        • Partager sur Facebook
        • Partager sur Twitter
          15 juillet 2019 à 17:43:55

          Bonjour,

          Le comportement est normal selon la doc PG : https://www.postgresql.org/docs/9.1/functions-comparison.html

          Je pense qu'il faudra rajouter une condition IS DISTINCT FROM ... comme proposé ;)

          -
          Edité par Benzouye 15 juillet 2019 à 17:44:57

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

          Postgresql, le != ne prend pas les NULL

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown