2015-01-28 21 views
6

ho colonna (Numbers), che ha valori come segue:TrimEnd equivalente in SQL Server

1,2,3 
1,2,3, 
1,2,3,,, 
1,2,3,,,,,, 

voglio Tagliare tutte le virgole alla fine della stringa, quindi questo risultato sarebbe

1,2,3 
1,2,3 
1,2,3 
1,2,3 

ho cercato qui di seguito Query ma da questo siamo in grado di rimuovere solo un ultimo comma

DECLARE @String as VARCHAR(50) 
SET @String='1,2,3,4,,,,,,,,,,,,,,,,' 

SELECT CASE WHEN right(rtrim(@String),1) = ',' then substring(rtrim(@String),1,len(rtrim(@String))-1) 
    ELSE @String 
    END AS TruncString 

Come posso rimuovere tutte le virgole al en d di stringa?

risposta

9

È possibile farlo utilizzando:

LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1)) 

La premessa di questo è in primo luogo inverso la stringa utilizzando REVERSE:

REVERSE(Numbers) --> ,,,,,,3,2,1 

È quindi trovare la posizione del primo carattere che non è una virgola utilizzando PATINDEX e il pattern match [^,]:

PATINDEX('%[^,]%', REVERSE(Numbers)) --> ,,,,,,3,2,1 = 7 

quindi è possibile utilizzare la lunghezza della stringa usando LEN, per ottenere la posizione inversa , cioè se la posizione del primo carattere che non è una virgola è 7 nella stringa invertita e la lunghezza della stringa è 10, allora hai bisogno dei primi 4 caratteri della stringa.È quindi utilizzare SUBSTRING per estrarre la parte rilevante

Un esempio completo sarebbe

SELECT Numbers, 
     Reversed = REVERSE(Numbers), 
     Position = PATINDEX('%[^,]%', REVERSE(Numbers)), 
     TrimEnd = LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1)) 
FROM (VALUES 
      ('1,2,3'), 
      ('1,2,3,'), 
      ('1,2,3,,,'), 
      ('1,2,3,,,,,,'), 
      ('1,2,3,,,5,,,'), 
      (',,1,2,3,,,5,,') 
     ) t (Numbers); 

EDIT

In risposta a una modifica, che ha avuto alcuni errori nella sintassi, la di seguito ha funzioni per tagliare l'inizio e tagliare entrambi i lati di virgole:

SELECT Numbers, 
     Reversed = REVERSE(Numbers), 
     Position = PATINDEX('%[^,]%', REVERSE(Numbers)), 
     TrimEnd = LEFT(Numbers, LEN(Numbers) - (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1)), 
     TrimStart = SUBSTRING(Numbers, PATINDEX('%[^,]%', Numbers), LEN(Numbers)), 
     TrimBothSide = SUBSTRING(Numbers, 
            PATINDEX('%[^,]%', Numbers), 
            LEN(Numbers) - 
             (PATINDEX('%[^,]%', REVERSE(Numbers)) - 1) - 
             (PATINDEX('%[^,]%', Numbers) - 1) 
            ) 
FROM (VALUES 
      ('1,2,3'), 
      ('1,2,3,'), 
      ('1,2,3,,,'), 
      ('1,2,3,,,,,,'), 
      ('1,2,3,,,5,,,'), 
      (',,1,2,3,,,5,,') 
     ) t (Numbers); 
1

Poiché ci sono più occorrenze non è possibile farlo con una semplice espressione di funzione incorporata, ma una semplice funzione definita dall'utente può eseguire il lavoro.

create function dbo.MyTrim(@text varchar(max)) returns varchar(max) 
as 
-- function to remove all commas from the right end of the input. 
begin 

    while (right(@text, 1) = ',' 
    begin 
     set @text = left(@text, len(@text) - 1) 
    end 

    return @text 

end 
go 
1

È possibile cercare la prima occorrenza di ',,' e prendere tutto prima che:

select (case when numbers like '%,,' 
      then left(numbers, charindex(',,', numbers) - 1) 
      when numbers like '%,' 
      then left(numbers, len(numbers) - 1) 
      else numbers 
     end) 

Nota: sembrerebbe che si archiviano liste di cose in una stringa delimitata da virgole. Di solito è meglio memorizzarli usando una tabella di giunzione.

EDIT:

Oppure, un modo alternativo di formulare questo senza l'case:

select left(numbers + ',,', charindex(',,', numbers + ',,') - 1) 
+0

cede risultato exceprt per ** 1,2,3, ** –

+0

@VigneshKumar. . . Buon punto Risolto il problema. –

+0

sì è ora riparato. ma non ha funzionato per questo ** ',, 1,2,3 ,,, 5 ,,' **. Non è un caso per me, ma ho solo detto –

0

Run sotto query e ottenere risultati attesi

declare @sql varchar(500) 

set @sql ='1,2,3,,,,,,' 

select left(@sql,case charindex(',,',@sql,0) 
when 0 then len(@sql)-1 
else charindex(',,',@sql,0)-1 
end) 
+0

Cosa succede se @sql è '1,, 2,3 ,,,,,,' ?? Restituirà solo 1. –