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 :

Problème sur CHARINDEX dans une condition


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 11
    Par défaut Problème sur CHARINDEX dans une condition
    Salut a tous j'ai fais un post il n'y a pas longtemps sur la BDD sur laquelle je travaille
    Si il vous manque quelques précisions sur ce post je vous conseille d'aller lire ce lien :
    https://www.developpez.net/forums/d1...onnee-d-table/

    Mais pour faire simple je dois récuperer des infos sur plein de table et en faire une synthèse, ce coup si je dois récupérer un numéro de MSN
    qui est présent dans la colonne Del_Date_Text de la table SO_Items le MSN seras présenté sous la forme "MSN[un certain nombre de chiffre de 0 à 9]"
    dans la colonne. Le soucis c'est que les cases de la colonne peuvent être vide ou être remplis avec d'autre info qui ne me sont pas utile
    je voudrais donc seulement récupérer ce numéro de MSN ou mettre NULL quand ça ne m’intéresse pas dans ma table EXTRACT_CR pour ça j'ai fait ce bout de requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE PARADEMODW.dbo.[EXTRACT_CR]
    	SET PARADEMODW.dbo.[EXTRACT_CR].[MSN_No] = 
    	--CASE WHEN CHARINDEX('MSN[0-9]+', RTRIM(LTRIM(SO.[Del_Date_Text]))) > 0 THEN 
    	SUBSTRING(RTRIM(LTRIM(SO.[Del_Date_Text])),
    	CHARINDEX('MSN[0-9]+', RTRIM(LTRIM(SO.[Del_Date_Text]))), 
    	LEN(RTRIM(LTRIM(SO.[Del_Date_Text]))) + 1 - (CHARINDEX('MSN[0-9]+', RTRIM(LTRIM(SO.[Del_Date_Text]))) + CHARINDEX('[0-9]+NSM', REVERSE(RTRIM(LTRIM(SO.[Del_Date_Text]))))))
    	--ELSE NULL END
    	FROM PARADEMODW.dbo.[EXTRACT_CR] AS result INNER JOIN [SO_Items] AS SO
    	ON  result.[Part_No]    = SO.[Part_No] 
    	AND result.[SO_No]      = SO.[SO_No] 
    	AND result.[SO_Line_No] = SO.[SO_Line_No]
    Si je laisse la requête comme ça ça vas me remplir EXTRACT_CR.MSN_No avec toutes les colonnes "bien" remplis.
    C-A-D avec tout les MSN et mais aussi les infos que ne souhaite pas avoir (ma requête aura virer au passage les espaces qui traînent)
    Et si je vire ma condition en commentaire ça me remplis toutes les cases avec NULL.
    J'ai 3 pistes sur l'erreur que j'ai pus faire, sois j'ai foiré ma condition,
    soit c'est le traitement de mes chaînes de caractères dans le bout de code entre mes 2 commentaires qui foire
    (Mais étrangement ça quand même un bon comportement quand ça tombe sur une cases qui comporte un MSN)
    soit c'est CHARINDEX qui a un comportement et que je comprend pas dans ma condition
    Avant qu'on me fasse la remarque (C'est pour toi SQL_Pro) je peut pas changer mes appels de table
    c'est imposé comme ça par mon entreprise/Responsable.
    Si vous avez une alternative au combo LTRIM/RTRIM je dis pas non (Je travaille sous SQL Server 2008 donc TRIM tout seul marche pas)

    Merci d'avance à ceux qui participe à la conversation
    Gardez le feu brûlant dans votre cœur

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    A première vue, vous utilisez mal CHARINDEX, qui effectue une recherche exacte de la chaine spécifiée.
    Ne devriez-vous pas plutôt utiliser PATINDEX à la place, qui effectue une recherche à partir d'un modéle (comme LIKE ) ?

    C'est ce que laisse penser le '[0-9]' qui semblent être une recherche générique.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 11
    Par défaut
    Tu as raison la fonction PATINDEX correspond exactement a ce que je veut faire
    mais après avoir changé mon code le résultat reste le même, j'enlève mes 2 lignes en commentaire
    ca me copie tout, même les ligne que je veut pas. Je met les 2 commentaires ça me remplit ma colonne
    MSN_No de NULL (Je remet la nouvelle version de ma requète autant je me suis planté en adaptant pour PATINDEX)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    UPDATE PARADEMODW.dbo.[EXTRACT_CR]
    	SET PARADEMODW.dbo.[EXTRACT_CR].[MSN_No] = 
    	--CASE WHEN PATINDEX('%MSN[0-9]+%', RTRIM(LTRIM(SO.[Del_Date_Text]))) > 0 THEN 
    	SUBSTRING(RTRIM(LTRIM(SO.[Del_Date_Text])),
    	PATINDEX('%MSN[0-9]+%', RTRIM(LTRIM(SO.[Del_Date_Text]))), 
    	LEN(RTRIM(LTRIM(SO.[Del_Date_Text]))) + 1 - (PATINDEX('%MSN[0-9]+%', RTRIM(LTRIM(SO.[Del_Date_Text]))) + PATINDEX('%[0-9]+NSM%', REVERSE(RTRIM(LTRIM(SO.[Del_Date_Text]))))))
    	--ELSE NULL END
    	FROM PARADEMODW.dbo.[EXTRACT_CR] AS result INNER JOIN [SO_Items] AS SO
    	ON  result.[Part_No]    = SO.[Part_No] 
    	AND result.[SO_No]      = SO.[SO_No] 
    	AND result.[SO_Line_No] = SO.[SO_Line_No]
    Désolé pour la réponse tardive j'ai lut ton message vendredi dernier mais je n'ai eu l'occasion de le tester que ce matin


    UPDATE : C'est mon expression régulière qui foire

    PATINDEX('%MSN[0-9]+%', RTRIM(LTRIM(SO.[Del_Date_Text])))

    Ca ne trouve rien du tout.
    Ce que je cherche c'est un truc sous la forme "MSN + éventuellement un espace + un certain nombre de chiffres de 0 à 9"
    Il peut y avoir des truc avant et/ou après qui ne m'interresse pas
    Après avoir tester quelque truc sur regex101 mon expression régulière doit pouvoir faire en SQL ce que
    l'expression "MSN\s?[0-9]*" fait en PHP. Pas moyen de tester mon regex SQL sur ce site.
    Et forcément le regex PHP marche pas en SQL

    Si vous avez des pistes merci d'avance =)

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Vous pouvez tester les deux cas (avec ou sans espace) et prendre la valeur > 0

    un truc dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    COALESCE(NULLIF(PATINDEX('%MSN[0-9]+%',RTRIM(LTRIM(SO.[Del_Date_Text]))), 0), PATINDEX('%MSN [0-9]+%',RTRIM(LTRIM(SO.[Del_Date_Text]))))

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2017
    Messages : 11
    Par défaut
    Euh merci pour la réponse mais je me suis rendu compte que les différentes formes de ce MSN sont trop variable
    (La case remplie par l'utilisateur est considéré comme un commentaire donc il peut rentrer tout et n'importequoi)
    Au final si je remplit les cases avec tout les commentaire qui on MSN présent dans le texte c'est plus simple et ca fonctionne
    C'est dommage de pas arriver a faire un truc méga propre mais honnêtement ça fait une semaine que j'y réfléchie et ça commence a me faire grave chier
    Voila ce que j'ai fait au final ça marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UPDATE PARADEMODW.dbo.[EXTRACT_CR]
    	SET PARADEMODW.dbo.[EXTRACT_CR].[MSN_No] = 
    	CASE WHEN PATINDEX('%MSN%', RTRIM(LTRIM(SO.[Del_Date_Text]))) >= 1 THEN RTRIM(LTRIM(SO.[Del_Date_Text]))
    	ELSE NULL END
    	FROM PARADEMODW.dbo.[EXTRACT_CR] AS result INNER JOIN [SO_Items] AS SO
    	ON  result.[Part_No]    = SO.[Part_No] 
    	AND result.[SO_No]      = SO.[SO_No] 
    	AND result.[SO_Line_No] = SO.[SO_Line_No]
    Merci pour le tips sur PATINDEX Personnellement je considère le problème comme résolue
    J'attend que tu me dise ce que t'en pense et je ferme le sujet

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

Discussions similaires

  1. problème d'extension dans une condition
    Par Marion33 dans le forum VBScript
    Réponses: 4
    Dernier message: 07/06/2017, 18h37
  2. [AC-2007] Condition sur focus dans une macro
    Par damsmut dans le forum IHM
    Réponses: 6
    Dernier message: 17/12/2009, 15h00
  3. [z/OS] Problème dans une condition
    Par a_karim_fr dans le forum Cobol
    Réponses: 6
    Dernier message: 19/11/2009, 10h31
  4. problème de substring dans une condition
    Par spols dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2009, 00h16
  5. Réponses: 1
    Dernier message: 13/12/2006, 21h31

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