2016-06-09 1 views
3

Dans ma colonne de table, j'ai ci-dessous les données d'échantillonsComment remplacer un caractère dans une chaîne en utilisant T-SQL

Test1 145, Area 1 
Test2 146, 
Test3 145, Area 2, Plot 10 

Ce que je veux atteindre est de remplacer « » dans la chaîne, mais seulement si elle est le dernier caractère. Si j'ai plus de caractères après "," alors le remplacement devrait laisser la chaîne telle quelle.

Dans l'exemple ci-dessus, le remplacement ne fonctionne que dans la ligne 2.

Le prévu eteint serait comme ci-dessous

Test1 145, Area 1 
Test2 146 
Test3 145, Area 2, Plot 10 

Dans la ligne 2 ci-dessus, « » a été remplacé par vide espace.

J'ai essayé ce Replace(column1, ', ', '') AS ColName mais cela remplace tous les "," dans Test1 et Test3.

+0

Ainsi, les 3 lignes sont une seule valeur ou montrent 3 lignes que vous? –

+0

@AlexK. J'indique 3 lignes – StackTrace

+4

Copie possible de [SQL: supprimer la dernière virgule dans la chaîne] (http://stackoverflow.com/questions/31420597/sql-remove-last-comma-in-string) –

Répondre

1

Je suis assez sûr IIF n'est pas disponible dans SQL Server 2005. Il s'agit essentiellement de la même logique que la réponse précédente utilisant CASE à la place.

declare @MyString varchar(50) 

set @MyString = 'Test2 146,' 

select 
case 
    when right(rtrim(@MyString), 1) = ',' then 
     substring(@MyString, 1, len(rtrim(@MyString)) - 1) 
    else 
     @MyString 
end 
2

Vous pouvez essayer ceci:

DECLARE @value VARCHAR(1024) = 'Test2 146,'; 

SELECT IIF(RIGHT(@value,1) = ',', LEFT(@value, LEN(@value) - 1), @value); 

Pour la colonne, il ressemble à ci-dessous:

DECLARE @DataSource TABLE 
(
    [value] VARCHAR(1024) 
); 

INSERT INTO @DataSource ([value]) 
VALUES ('Test1 145, Area 1') 
     ,('Test2 146,') 
     ,('Test3 145, Area 2, Plot 10'); 


SELECT IIF(RIGHT([value],1) = ',', LEFT([value], LEN([value]) - 1), [value]) 
FROM @DataSource; 
+0

ressemble à 'IIF' est disponible uniquement en 2012+ – StackTrace

+0

Vous pouvez utiliser l'instruction 'CASE' - vérifiez les réponses ci-dessous. – gotqn

0

Quelque chose comme ceci:

SELECT CASE 
      WHEN Column1 LIKE '%,' THEN STUFF(column1, LEN(column1), 1, '') 
      ELSE Column1 
     END 
2

Vous pouvez aussi le faire sera LIKE et IIF:

SELECT IIF(t.Column LIKE '%,' , LEFT(t.column, LEN(t.column) - 1) , t.column) as new_val 
FROM YourTable t 

Pour les versions antérieures: Vous pouvez utiliser CASE EXPRESSION depuis IIF est uniquement disponible depuis la version 2012+ (Lien par @gotqn)

SELECT CASE WHEN t.Column LIKE '%,' 
      THEN LEFT(t.column, LEN(t.column) - 1) 
      ELSE t.column 
     END as new_val 
FROM YourTable t 
+0

Bien sûr, je viens aussi de remarquer que cela est étiqueté 2005, donc cela ne fonctionnera pas pour l'OP. Mais cela marchera pour d'autres qui trébuchent ici dans le futur. –

+0

Le 'IIF' ne fonctionnera pas, mais le cas ne le fera pas? Ou une autre fonction ici n'est pas disponible dans cette version non plus? – sagi

+1

'CASE' est OK - IIF est à partir de 2012+ éditions (https://msdn.microsoft.com/en-us/library/hh213574.aspx) – gotqn

0

Ceci montre une façon de faire il.

DECLARE @test VARCHAR(30); 

SET @test = 'Test1, 145, Area 1'; 

SELECT @test; 

IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0 
BEGIN 
    SET @test = Replace(@test, ',', ''); 
END 

SELECT @test; 

SET @test = 'Test2 146,'; 

SELECT @test; 

IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0 
BEGIN 
    SET @test = Replace(@test, ',', ''); 
END 

SELECT @test; 

SET @test = 'Test3 145, Area 2, Plot 10'; 

SELECT @test; 

IF CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0 
BEGIN 
    SET @test = Replace(@test, ',', ''); 
END 

SELECT @test; 

- Comment travailler dans une instruction SELECT

SET @test = 'Test2 146,'; 

SELECT CASE WHEN CHARINDEX(',', @test, LEN(RTRIM(@test))) > 0 THEN SUBSTRING(@test, 1, LEN(@test) - 1) ELSE @test END AS 'Converted Value';