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 :

NULL ET LIKE


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut NULL ET LIKE
    Bonjour

    J'ai un problème que je pensais de prime abord simple mais dont je ne vois pas le bout.
    J'ai une procédure stockée avec SELECT et un WHERE mon_champ = mom_parametre où mom_parametre = '%'
    Il me renvoie toutes les lignes sauf celles ou mon_champ est NULL

    Existe-il un moyen de d'inclure ces lignes en gardant le caractère dynamique de la claure WHERE ?

    Pour être plus précis, ma problématique est que si mon paramètre est vide, je souhaite renvoyer toutes les lignes, y compris les valeurs NULL et ce, pour plusieurs paramètres.

    Merci d'avance

    Herve Aouate

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Utilisez la fonction SQL normative COALESCE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE COALESCE(MaColonne, '') LIKE ???
    ou bien la prédicat IS NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE Macolonne LIKE ??? OR MaColonne IS NULL.
    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/ * * * * *

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Ou encore la fonction ISNULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ISNULL(MaColonne, '') LIKE ???
    Elle fonctionne pareillement que COALESCE, excepté qu'elle ne prend que deux paramètres.

    @++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Bonjour

    Je vous remercie tous les deux de vos réponses mais je n'ai pas bien expliqué ma question.

    Je souhaite écrire une procédure stockée avec plusieurs paramètres en entrée qui seront utilisés comme conditions dans le WHERE.
    Mais je souhaite que si un ou plusieurs de ces paramètres est NULL ou vide ou égal à 0, ils ne soient plus utilisés dans le WHERE.

    Exemple
    J'ai en entrée un code banque et un code agence.

    1) Si code banque =17 et code agence = 25 : je veux retourner tous les enregistrements dont le code banque =17 et code agence = 25 (Jusque là facile )

    2) Si code banque =17 et code agence = 0 : je veux retourner tous les enregistrements dont le code banque = 17, et ce quel quel soit le code agence, y compris s'il n'est pas renseigné (Là est mon problème )

    Dans le cas 2, vos solutions me renverraient uniquement les enregistrements dont le code banque = 17 et dont le code agence est NULL

    Sachant que je peux avoir jusqu'à une quinzaine de paramètres.

    Merci d'avance

    Herve Aouate

  5. #5
    Membre actif Avatar de hazamor
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2008
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2008
    Messages : 179
    Points : 206
    Points
    206
    Par défaut Utilisez l'operateur OR
    Utilisez l'operateur OR:


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...
    Where col1= :par1 OR col12= :par2 OR col3= :par3 ...


  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Non, cela ne convient pas car dans le cas de mon exemple 1, j'aurais les lignes qui correspondent à la première condition ou à la deuxième condition alors que je souhaiterai les lignes qui correspondent aux deux conditions.

    Merci quand même

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Commencez pas respecter les règles du forum.
    http://www.developpez.net/forums/d96...vement-poster/
    On vous comprendra mieux et tout le monde perdra moins de temps. Vous à attendre une solution, et nous a tenter de vous répondre bien gentillement !

    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/ * * * * *

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Bonjour

    D'abord, je vous remercie de votre gentillesse.

    Ensuite, dans l'esprit de faire perdre le moins possible de temps aux personnes qui aident les gens comme moi, pourriez-vous me dire concrètement ce qui ne convient pas dans mes posts.
    Si vous faites référence à l'absence de code, c'est simplement parce que je ne l'ai pas encore écrit. D'où le problème.

    Merci d'avance

    Bien cordialement

    Herve Aouate

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Une piste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    CREATE PROCEDURE usp_Recherche_Agence
    	@_nomAgence VARCHAR(50) = NULL
    	@_codeBanque INT,
    	@_codeAgence INT
    AS
    BEGIN
    	SELECT mesColonnes
    	FROM dbo.TbAgences
    	WHERE
    	(
    		@_codeBanque = 0
    		OR ISNULL(codeBanque, 0) = @_codeBanque
    	)
    	AND 
    	(
    		@_codeAgence = 0
    		OR ISNULL(codeAgence, 0) = @_codeAgence
    	)
    	AND
    	(
    		@_nomAgence IS NULL
    		OR ISNULL(@_nomAgence, '') LIKE '%' + @_nomAgence + '%'
    	)
    END
    Dans tous les cas le code que vous écrirez n'est ni performant ni optimisable, comme celui que je viens de vous proposer ...

    @++

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 68
    Points : 40
    Points
    40
    Par défaut
    Même si effectivement c'est un peu complexe à mettre en place avec la quinzaine de paramètres que j'ai, l'idée est très intéressante et efficace.

    Merci beaucoup.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    pourriez-vous me dire concrètement ce qui ne convient pas dans mes posts.
    Le non respecte de la charte... Alors puisque vous ne l'avez visiblement pas lu, je vous la copie colle :

    Poster le SQL DDL de la définition de vos objets :

    C'est facile avec SQL Server :
    Dans Entreprise Manager, clic droit sur la table "Toutes les tâches / Générer un script SQL".
    Cela permet aux personnes qui tent de vous répondre :
    1) de mieux comprendre votre problème (nom clair des objets)
    2) de reproduire votre problématique sur leur machine pour mieux vous aider !

    Exemple :
    Code :

    CREATE TABLE [T_CLIENT] (
    [CLI_ID] [int] NOT NULL ,
    [TIT_CODE] [char] (8) COLLATE French_CS_AS NULL ,
    [CLI_NOM] [char] (32) COLLATE French_CS_AS NOT NULL ,
    [CLI_PRENOM] [varchar] (25) COLLATE French_CS_AS NULL ,
    [CLI_ENSEIGNE] [varchar] (100) COLLATE French_CS_AS NULL ,
    CONSTRAINT [PK_T_CLIENT] PRIMARY KEY CLUSTERED ( [CLI_ID]) ON [PRIMARY] ,
    CONSTRAINT [FK_T_CLIENT_L_CLI_TIT_T_TITRE] FOREIGN KEY ([TIT_CODE]) REFERENCES [T_TITRE] ([TIT_CODE])
    ) ON [PRIMARY]
    GO

    De la même façon, un jeu d'essais tout prêt (ordres SQL INSERT) permet de tester les solutions proposées.
    Exemple :
    Code :

    INSERT INTO T_CLIENT VALUES (33, 'M.', 'Dupont', 'Marcel', 'A la bonne charcutière')
    INSERT INTO T_CLIENT VALUES (41, 'Mme.', 'Martin', 'Jeanine, NULL)

    Vous pouvez vous aider de la procédure suivante pour reconstituer un tel jeu d'essais :
    http://vyaskn.tripod.com/code/generate_inserts.txt

    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/ * * * * *

  12. #12
    FMJ
    FMJ est déconnecté
    Membre averti
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    416
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 416
    Points : 356
    Points
    356
    Par défaut
    J'ai pas très bien saisi ce qui était écrit vers le milieu.

    Pourriez-vous écrire plus distinctement SVP ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Doctrine] IS NULL en LIKE NULL, non merci !
    Par Invité dans le forum ORM
    Réponses: 4
    Dernier message: 17/09/2011, 14h09
  2. [VB6] [BDD] Recordset et champ égal à Null
    Par Gr|ppen dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/03/2003, 10h00
  3. [VB6] [ADO] Like sur base Access
    Par dlpxlid dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 24/01/2003, 11h03
  4. "ALTERER" une col. NULL en NOT NULL - Int
    Par Gandalf24 dans le forum SQL
    Réponses: 2
    Dernier message: 28/12/2002, 00h07
  5. Créer un interpréteur de langage inspiré du Basic
    Par Picasso dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 11/05/2002, 17h10

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