web-dev-qa-db-fra.com

Comment supprimer un caractère spécifique d'une chaîne, uniquement s'il s'agit du premier ou du dernier caractère de la chaîne.

Supposons que j'ai une chaîne 1,2,3, J'aimerais supprimer le dernier , ou si la chaîne ressemble à ,1,2,3, ou ,1,2,3, j'aimerais quand même obtenir 1,2,3 comme résultat. Et s'il vous plaît essayez d'être un peu explicatif dans votre réponse. Je ne veux pas simplement copier du contenu sans le comprendre. Je vous remercie.

12
Arbaaz

Une façon de traiter ce type de virgule consiste à utiliser une instruction CASE:

CASE
    WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2)
    WHEN str LIKE ',%'  THEN RIGHT(str, LEN(str)-1)
    WHEN str LIKE '%,'  THEN LEFT(str, LEN(str)-1)
    ELSE str
END

C’est très explicite: la déclaration CASE considère trois situations -

  • Lorsque la chaîne str comporte des virgules des deux côtés,
  • Lorsque la chaîne str commence par une virgule, mais ne se termine pas par un, et
  • Lorsque la chaîne str se termine par une virgule, mais ne commence pas par une.

Dans le premier cas, les premier et dernier caractères sont supprimés; dans le second cas, le caractère le plus à gauche est supprimé; dans le dernier cas, le caractère de fin est supprimé.

Démo sur sqlfiddle.

20
dasblinkenlight
declare @str varchar(20)=',1,2,3,'

select   case
         when @str like ',%,' then stuff(stuff(@str, 1, 1, ''),LEN(stuff(@str, 1, 1, '')),1,'')

         when @str like ',%' then stuff(@str, 1, 1, '')

         when @str like '%,' then stuff(@str, LEN(@str), 1, '')

         else @str
         end
1
Poonam

Essaye ça. REVERSE (SUBSTRING (REVERSE (fld), 2, LEN (fld))) Le dernier caractère sera toujours pris malgré le . Vous pouvez insérer une instruction CASE WHEN pour garantir que le dernier caractère est une virgule en disant simplement CASE WHEN REVERSE (SUBSTRING (fld, 1,1)) = ',' THEN REVERSE (SUBSTRING (REVERSE (fld), 2, LEN (fld))) SINON FLD FIN DU FLD

0
jneal

Si vous souhaitez simplement supprimer une virgule de fin dans SQL Server, j'utiliserais la fonction STUFF.

SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable
0
Ben82

Si vous devez remplacer une seule virgule (comme dans votre question initiale) au début ou à la fin, alors:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, IIF(LEFT(str,1)=',',2,1), 
                      LEN(str)-IIF(LEFT(str,1)=',',1,0)
                              -IIF(RIGHT(str,1)=',',1,0))
    ELSE str
END

Si ,,,,1,2,3,,,, est possible, utilisez PATINDEX () fonction avec '%[0-9]% masque:

CASE
    WHEN str LIKE '%,%' THEN 
       SUBSTRING(str, PATINDEX('%[0-9]%',str), 
                      LEN(str)-(PATINDEX('%[0-9]%',str)-1)
                              -(PATINDEX('%[0-9]%',REVERSE(str))-1))
    ELSE str

END

SQLFiddle demo

0
valex

dept_name est le nom de la colonne et 'I' est un caractère que vous souhaitez remplacer.

SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like  '%I'
0
Poonam

CASE fonctionnerait ici. Je pense à quelque chose comme ça:

CASE 

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 AND ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT MID(YourString, 2, LEN(YourString) - 2)

WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1
THEN SELECT LEFT(YourString, LEN(YourString) -1)

WHEN ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT RIGHT(YourString, LEN(YourString) - 1)

ELSE SELECT YourString

END

Cela fonctionne quel que soit le caractère car il vérifie si le premier et le dernier sont numériques en premier, sinon récupérez votre nouvelle chaîne, sinon vérifiez si la fin est numérique sinon sélectionnez la chaîne à côté de la fin voyez si le début est numérique sinon sélectionnez la chaîne en plus du début, sinon récupérez votre chaîne.

0
shadowjfaith

Quelques options, toutes utilisant SQLCLR, si cela ne vous est pas refusé. Vous pouvez écrire vos propres fonctions pour faire ces choses, mais les exemples que je vais montrer sont basés sur la bibliothèque SQL # (SQLsharp) . Je suis l'auteur de la bibliothèque SQL #, mais les deux premiers exemples utilisent des fonctions disponibles dans la version gratuite. Le 3ème exemple, en utilisant TrimChars (), n’est pas gratuit mais je l’ai inclus par souci d’exhaustivité car c’était tellement simple ;-). Dans chaque exemple, les caractères à l'intérieur des virgules avant ou après extra peuvent être n'importe quoi. 

  1. Une expression régulière assez simple à utiliser dans un groupe de capture pour obtenir tout, de la première valeur sans virgule à la dernière valeur sans virgule:

    SELECT SQL#.RegEx_CaptureGroup(N',,12,123,12334,567,,,,,',
                                   N'^,*(.+?),*$', -- Regular Expression
                                   1, -- Capture Group to return
                                   '', -- not found replacement
                                   1, -- Start At position
                                   -1, -- Length
                                   '' -- RegEx Options
                                   )
    
  2. Si vous supprimez les virgules supplémentaires pour obtenir une liste vide pour la scission, vous pouvez les scinder et demander à la fonction de scission de supprimer les valeurs vides pour vous, sans avoir à vous soucier de l'emplacement des valeurs vides, même au milieu:

    SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2)
    -- 2 = remove empty values
    
  3. Vous pouvez effectuer un ajustement simple qui supprime le caractère spécifié des deux côtés jusqu'à ce qu'il trouve un caractère qui n'est pas le caractère à ajuster:

    SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
    
0
Solomon Rutzky