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.
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 -
str
comporte des virgules des deux côtés,str
commence par une virgule, mais ne se termine pas par un, etstr
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é.
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
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
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
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
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'
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.
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.
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
)
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
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',')