È 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);
cede risultato exceprt per ** 1,2,3, ** –
@VigneshKumar. . . Buon punto Risolto il problema. –
sì è ora riparato. ma non ha funzionato per questo ** ',, 1,2,3 ,,, 5 ,,' **. Non è un caso per me, ma ho solo detto –