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

Sybase Discussion :

Pb sur une requête DELETE sur une chaine


Sujet :

Sybase

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut Pb sur une requête DELETE sur une chaine
    Bonjour,

    Je vous demande de l'aide car je voudrais supprimer dans une table tous les enregistrements commençant par une chaine particulière.

    MaTable contient 2 champs : n° ordre de type "1234567" et un champ TXTPA en texte

    Je voudrais supprimer tous les enregistrements dont le champ TXTPA commence par "[TOTO]"

    voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    declare @cpt1 int
    select @cpt1 = 1
    while (@cpt1 <= (select count (*) from matable))
    begin
    if (select left (convert (varchar,TXTPA),6) from matable) = '[TOTO]'
    begin
    delete from matable
    end
    select @cpt1=@cpt1 +1
    end
    select * from matable
    Quand j'effectue la requête, j'ai le message d'erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Subquery returned more than 1 value.  This is illegal when the subquery follows =, !=, <, <= , >, >=, or when the subquery is used as an expression.
    Comment positionner l'enregistrement à supprimer à la position de mon compteur @cpt1 ?

    Merci d'avance pour votre aide !!!
    Cordialement

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Houlà!

    A mon avis la boucle de base me semble franchement pas bonne... Le statement DELETE dans la boucle va vider la table, ce qui n'est certainement pas le résultat désiré.

    Il me semble que ceci devrait remplir la condition demandée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE 
        matable
    where
        substring(convert(varchar, TXTPA), 1, 6) = '[TOTO]'
    Pour info, le message d'erreur vient de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IF (SELECT LEFT (convert (varchar,TXTPA),6) FROM matable) = '[TOTO]'
    parce que le SELECT remonte plusieurs lignes, et ne peut donc pas être utilisé dans une comparaison de cette façon.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 45
    Points
    45
    Par défaut
    ... ou comment en une seule ligne en remplacer une trentaine !

    Bravo pour la réponse aussi rapide !

    Merci beaucoup ! J'ai encore beaucoup à apprendre

  4. #4
    Futur Membre du Club
    Inscrit en
    Août 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Hey
    A titre d'inbformation, tu peux aussi utiliser l'operateur LIKE:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DELETE matable
    WHERE TXTPA LIKE '[TOTO]%'
    NB: L'operateur LIKE ne respecte pas la casse.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Citation Envoyé par houssamboum Voir le message

    NB: L'operateur LIKE ne respecte pas la casse.
    Euh... c'est pas tout à fait juste - LIKE fonctionne comme d'autre comparaisons de chaines, et utilise le charset et sort-order qui a été configuré pour le serveur. Le sort-order peut être insensible à la casse, mais par défaut le sort-order est "case-sensitive".

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/02/2011, 12h01
  2. [MySQL] Problème boutons générés par une requête éxécutant chacun une requête
    Par terminathan dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 07/12/2009, 17h48
  3. Réponses: 1
    Dernier message: 05/11/2008, 13h04
  4. [SQL] Construction d'une requête à partir d'une requête
    Par Pgs dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/09/2007, 16h24
  5. [Requête] Utilisation d'une fonction perso dans une requête
    Par Julien Dufour dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 16/03/2007, 10h53

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