J'essaie de supprimer les espaces d'une chaîne en SQL mais les fonctions LTRIM
et RTRIM
ne semblent pas fonctionner
Colonne:
[ProductAlternateKey] [nvarchar](25) COLLATE Latin1_General_CS_AS NULL
Question:
select REPLACE(ProductAlternateKey, ' ', '@'),
LEN(ProductAlternateKey),
LTRIM(RTRIM(ProductAlternateKey)) AS LRTrim,
LEN(LTRIM(RTRIM(ProductAlternateKey))) AS LRLen,
ASCII(RIGHT(ProductAlternateKey, 1)) AS ASCIIR,
ASCII(LEFT(ProductAlternateKey, 1)) AS ASCIIL,
ProductAlternateKey
from DimProducts
where ProductAlternateKey like '46783815%'
Résultat:
| COLUMN_0 | COLUMN_1 | LRTrim | LRLen | ASCIIR | ASCIIL | PRODUCTALTERNATEKEY |
---------------------------------------------------------------------------------
| 46783815 | 8 | 46783815| 8| 53 | 52 | 46783815 |
| 46783815 | 10|46783815 | 10| 10 | 52 | 46783815 |
Peut-il s'agir d'autres symboles si LTRIM
et RTRIM
ne fonctionnent pas, comme "Entrée"?
En utilisant ASCII(RIGHT(ProductAlternateKey, 1))
, vous pouvez voir que le caractère le plus à droite de la ligne 2 est un saut de ligne ou un caractère ascii 10.
Ceci ne peut pas être supprimé à l’aide des fonctions standard LTrim
RTrim
.
Vous pouvez cependant utiliser (REPLACE(ProductAlternateKey, CHAR(10), '')
Vous voudrez peut-être aussi rendre compte des retours et des onglets. Ces trois (sauts de ligne, retours à la ligne et tabulations) sont les coupables habituels et peuvent être supprimés avec les éléments suivants:
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(ProductAlternateKey, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
Si vous rencontrez plus de caractères "d'espace blanc" qui ne peuvent pas être supprimés, essayez l'une ou l'ensemble des opérations ci-dessous:
--NULL
Replace([YourString],CHAR(0),'');
--Horizontal Tab
Replace([YourString],CHAR(9),'');
--Line Feed
Replace([YourString],CHAR(10),'');
--Vertical Tab
Replace([YourString],CHAR(11),'');
--Form Feed
Replace([YourString],CHAR(12),'');
--Carriage Return
Replace([YourString],CHAR(13),'');
--Column Break
Replace([YourString],CHAR(14),'');
--Non-breaking space
Replace([YourString],CHAR(160),'');
Cette liste de caractères d'espaces blancs potentiels pourrait être utilisée pour créer une fonction telle que:
Create Function [dbo].[CleanAndTrimString]
(@MyString as varchar(Max))
Returns varchar(Max)
As
Begin
--NULL
Set @MyString = Replace(@MyString,CHAR(0),'');
--Horizontal Tab
Set @MyString = Replace(@MyString,CHAR(9),'');
--Line Feed
Set @MyString = Replace(@MyString,CHAR(10),'');
--Vertical Tab
Set @MyString = Replace(@MyString,CHAR(11),'');
--Form Feed
Set @MyString = Replace(@MyString,CHAR(12),'');
--Carriage Return
Set @MyString = Replace(@MyString,CHAR(13),'');
--Column Break
Set @MyString = Replace(@MyString,CHAR(14),'');
--Non-breaking space
Set @MyString = Replace(@MyString,CHAR(160),'');
Set @MyString = LTRIM(RTRIM(@MyString));
Return @MyString
End
Go
Que vous pouvez ensuite utiliser comme suit:
Select
dbo.CleanAndTrimString(ProductAlternateKey) As ProductAlternateKey
from DimProducts
Dans ce cas, ce n'est pas un espace qui est en préfixe/suffixe.
La 1ère rangée semble OK. Procédez comme suit pour le contenu de la 2e rangée.
ASCII(RIGHT(ProductAlternateKey, 1))
et
ASCII(LEFT(ProductAlternateKey, 1))
Il peut y avoir 2 espaces après le texte, veuillez confirmer. Vous pouvez également utiliser les fonctions LTRIM
et RTRIM
?
LTRIM(RTRIM(ProductAlternateKey))
Peut-être que l'espace supplémentaire n'est pas un espace ordinaire (ASCII 32, espace modéré)? Peut-être qu'il s'agit d'un "espace dur", ASCII 160?
ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
On dirait que le personnage invisible -
ALT+255
Essaye ça
select REPLACE(ProductAlternateKey, ' ', '@')
--type ALT+255 instead of space for the second expression in REPLACE
from DimProducts
where ProductAlternateKey like '46783815%'
Raj
Edit: sur la base des résultats ASCII (), essayez ALT+10
- utilisez le pavé numérique
Que dis-tu de ça?
CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey)))
FROM DimProducts
where ProductAlternateKey like '46783815%'