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

MS SQL Server Discussion :

Impossible d'utiliser DISTINCT avec des types image et ntext


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Impossible d'utiliser DISTINCT avec des types image et ntext
    Bonjour,

    J'ai un table qui contient plusieurs champs dont :
    DO_NOM (varchar) , DO_SAVE (image), DO_CODE (image)

    j'ai besoin lors d'une requete de savoir si DO_SAVE et DO_CODE sont NULL, donc au début j'avais fait un SELECT * et je traitais mes réponses comme un grand. Le problème est que j'utilise des jointures avec plusieurs autres tables et j'obtiens donc plusieurs fois les mêmes valeurs.
    Dans un cas normal j'utiliserais DISTINCT, mais ca ne fonctionne pas avec MS SQL Server et les champs image (ou ntext).

    Je ne souhaite faire qu'une seule requête, donc je me demandais si il etait possible d'affecter un boolean pour me dire si mon champs est NULL ou pas.
    (mais j'accepte tout autre solution ! ;) )

    j'imaginais un truc du genre:
    SELECT DISTINCT DO_NOM, ( @VAR_SAVE = 1 IF DO_SAVE IS NULL ), (@VAR_CODE = 1 IF DO_CODE IS NULL) WHERE ...
    mais la ca semble être du fantasme!!:)

    Merci d'avance,
    l'espère que j'ai été clair! :)

  2. #2
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Utilisez la fonction COALESCE
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Soit je vois pas comment faire, soit ca pause pb:

    COALESCE :
    "Les types de données text, ntext et image ne peuvent pas être comparés ou classés, sauf lors de l'utilisation de l'opérateur LIKE ou IS NULL."

    Idem pour NULLIF...

    (ps: IFNULL n'existe pas pour SQLServer contrairement à ce que j'ai vu là : http://sql.developpez.com/sqlaz/fonctions/ )



    Je modifie (légèrement) ma routine imaginaire que je voyais plus haut:
    SELECT DISTINCT DO_NOM, ( @VAR_SAVE = 1 IF DO_SAVE IS NULL ELSE @VAR_SAVE = 0 ), (@VAR_CODE = 1 IF DO_CODE IS NULL ELSE @VAR_CODE = 0) WHERE ...

    C le else qui pose pb, avec COALESCE tu as la valeur par défaut OU la valeur. Moi il me faudrait une sorte de DECODE, mais c pas implanté dans SQL Server

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bon, j'ai trouvé une solution, mais j'ai honte de la donner... :)

    voilà comment je peut faire un DISTINCT avec un objet de type image:

    SELECT DISTINCT DO_NOM, CAST( CAST( DO_SAVE AS binary(1) ) AS char ) AS DO_SAVE ...
    FROM ...
    WHERE ...

    Le cast en binary permet le cast en char, et après je peux faire un DISTINCT dessus. C moche, mais j'obtiens le bon résultat.

    Je suis toujours preneur d'une meilleur solution...

  5. #5
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par azlinch
    Soit je vois pas comment faire, soit ca pause pb:

    COALESCE :
    "Les types de données text, ntext et image ne peuvent pas être comparés ou classés, sauf lors de l'utilisation de l'opérateur LIKE ou IS NULL."

    Idem pour NULLIF...

    (ps: IFNULL n'existe pas pour SQLServer contrairement à ce que j'ai vu là : http://sql.developpez.com/sqlaz/fonctions/ )



    Je modifie (légèrement) ma routine imaginaire que je voyais plus haut:
    SELECT DISTINCT DO_NOM, ( @VAR_SAVE = 1 IF DO_SAVE IS NULL ELSE @VAR_SAVE = 0 ), (@VAR_CODE = 1 IF DO_CODE IS NULL ELSE @VAR_CODE = 0) WHERE ...

    C le else qui pose pb, avec COALESCE tu as la valeur par défaut OU la valeur. Moi il me faudrait une sorte de DECODE, mais c pas implanté dans SQL Server
    Oups ! Désolé ! J'étais allé un peu vite en besogne... Votre solution n'est peut être pas élégante, mais si elle marche...

    Sinon, utilisez la fonction textptr() : elle retourne NULL si votre colonne est Null, sinon un pointeur en varbinary, si c'est plus adéquat pour vous
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

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

Discussions similaires

  1. Réponses: 28
    Dernier message: 09/01/2007, 16h30
  2. Réponses: 2
    Dernier message: 03/05/2006, 13h46
  3. Peut on utiliser OR avec des jointures de tables??
    Par gins06 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2005, 12h40
  4. Utiliser MySqlAdmin avec des droits utilisateurs sur XP
    Par thorgal85 dans le forum Outils
    Réponses: 2
    Dernier message: 18/03/2005, 12h19
  5. Réponses: 6
    Dernier message: 24/02/2005, 09h44

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