IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Gérer Null - zéro - Chaine vide


Sujet :

Développement SQL Server

  1. #1
    Lucas Panny
    Invité(e)
    Par défaut Gérer Null - zéro - Chaine vide
    Salut tout le monde!

    Ce que je sais c'est que NULL et '' (chaine vide) sont différents pour un VARCHAR de Sql Server
    Dans le cas: SELECT @field = field_name FROM table WHERE ...

    1) Si field_name de type NVARCHAR
    Lorsqu'aucun champ n'est trouvé, @field est NULL ou ''

    2) Si field_name de type UNIQUEIDENTIFIER
    Lorsqu'aucun champ n'est trouvé, @field est-il NULL ou autre valeur

    2) Si field_name de type INT
    Lorsqu'aucun champ n'est trouvé, @field est-il NULL ou autre valeur
    En fait, NULL et ZERO sont-ils égaux pour INT?

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    NULL is NULL (et rien d'autre !!!)

    NULL <> NULL
    NULL <> ''
    NULL <> 0

    Un champs NVarchar peut être vide '' ou NULL, ca dépend de votre implémentation. Est ce que le champ peut etre NULL ? Est ce qu'il y a une valeur par défaut ?

    Un uniqueidentifier - j'utilise pas ce type de donnée donc, prennez ce que je dis avec précaution - est généré automatiquement par SQL Server. Ce type sert en général de primary key et entre autre, tue vos performances. Ceci dit, je ne pense pas que vous puissiez retrouver de NULL dans ces champs, se serait un non sens complet qui plus est.

    Le type int, cf le cas du varchar.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 447
    Points
    52 447
    Billets dans le blog
    5
    Par défaut
    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/null/

    NULL n'étant pas une valeur, mais un marqueur d'absence de valeur il ne peut être comparé à rien.
    Imaginez deux personnes qui se sont aimés. L'une devient amnésique et perd toute sa mémoire (cerveau vide = NULL). Quels sont leurs souvenirs en commun ???

    (au fait merci Rudi, celle-là je te l'ais piquée !)


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Lucas Panny
    Invité(e)
    Par défaut
    Donc ??
    Un SELECT qui n'a rien trouvé retourne-t-il NULL donc??? (VARCHAR, INT et UNIQUEIDENTIFIER)

    Le type uniqueidentifier n'est bien évidemment pas seulement utilisé en clé primaire!!! (c'est une sorte de INT dont la taille est de 10 octets)

  5. #5
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Donc ??
    Un SELECT qui n'a rien trouvé retourne-t-il NULL donc??? (VARCHAR, INT et UNIQUEIDENTIFIER)

    Le type uniqueidentifier n'est bien évidemment pas seulement utilisé en clé primaire!!! (c'est une sorte de INT dont la taille est de 10 octets)
    Un select qui n'a rien trouvé retourne rien.

    Une sorte de INT dont la taille est 10 bytes. En sachant qu'un INT en fait 4, c'est tout de même un type de donnée 2.5 fois plus lourd...

  6. #6
    Lucas Panny
    Invité(e)
    Par défaut
    Un select qui n'a rien trouvé retourne rien.
    Oh que non! Si le champ est NVARCHAR, ça retourne plutôt une chaine vide '' que NULL
    Pour INT et UNIQUEIDENTIFIER, je suis entrain de vérifier!

  7. #7
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    Oh que non! Si le champ est NVARCHAR, ça retourne plutôt une chaine vide '' que NULL
    Pour INT et UNIQUEIDENTIFIER, je suis entrain de vérifier!
    Hmmm, je ne te suis pas trop.
    Qu'entends tu par un select qui n'a rien trouvé ?

    Imaginons une table fraichement créée avec 0 records...
    Faisons un select * from tableVide.
    Le select te retournera rien... Ce qui me parait logique.
    Cependant, rien <> '' et rien <> null.

  8. #8
    Lucas Panny
    Invité(e)
    Par défaut
    En fait ...
    Cependant, rien <> '' et rien <> null.
    Alors c'est quoi !!!???!!!

    J'ai fait ce test pour chaque type de mytable (nvarchar, uniqueidentifier, int)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @_chaine nvarchar(500)
    select @_chaine = comment from mytable where url = 'a'
    if @_chaine IS NULL
    	print 'null'
    else
    	print 'not null'
    Ca affiche tous null quand rien n'est trouvé. Donc, je conclus que c'est NULL quand on trouve rien

  9. #9
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Merci de poster les ddl de ta table ainsi que les data dedans pour qu'on puisse parler de la même chose.

  10. #10
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Citation Envoyé par Lucas Panny Voir le message
    En fait ...

    Alors c'est quoi !!!???!!!

    J'ai fait ce test pour chaque type de mytable (nvarchar, uniqueidentifier, int)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare @_chaine nvarchar(500)
    select @_chaine = comment from mytable where url = 'a'
    if @_chaine IS NULL
    	print 'null'
    else
    	print 'not null'
    Ca affiche tous null quand rien n'est trouvé. Donc, je conclus que c'est NULL quand on trouve rien
    Votre script retourne null tout simplement parce que votre variable @_chaine n'est pas initialisée !
    S'il n'y a pas de retour du select, rien ne va placer une valeur dans votre variable.

    P.S. : SELECT d'une variable NULL retournera bien NULL, votre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if @_chaine IS NULL
    	print 'null'
    else
    	print 'not null'
    est donc inutile
    Alexandre Chemla - Consultant MS BI chez Masao

  11. #11
    Lucas Panny
    Invité(e)
    Par défaut
    Là tu m'as éclairé Jinroh77!!

    Merci de poster les ddl de ta table ainsi que les data dedans pour qu'on puisse parler de la même chose.
    Mon problème ne nécessitait même pas une partie de mon code ou le DLL de ma table.
    Maintenant, je comprends quand c'est NULL? quand c'est une variable non initialisée, quand on n'insère rien dans un champ et ce champ est "nullable" ...... et INT = 0 <> INT = NULL

Discussions similaires

  1. Différence NULL et chaine vide
    Par bruce-willis dans le forum Débuter
    Réponses: 13
    Dernier message: 01/09/2008, 18h52
  2. Réponses: 2
    Dernier message: 06/02/2008, 23h14
  3. [V10/XE] chaine vides vs nulles :cry:
    Par 250rgv dans le forum Oracle
    Réponses: 5
    Dernier message: 25/08/2006, 10h32
  4. [8i]Chaine vide et NULL
    Par payenneville dans le forum Oracle
    Réponses: 10
    Dernier message: 26/01/2006, 19h55
  5. [BDD] renvoyer une chaine vide au lieu de null
    Par cmoulin dans le forum JDBC
    Réponses: 6
    Dernier message: 06/05/2004, 12h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo