Todo DBA ha recibido alguna vez la pregunta de algún desarrollador, (con cara de pánico), del estilo "Che, vos que tenés experiencia en T-SQL.. Cómo hago para extraer un valor (supongamos dinero), que no siempre va a tener la misma longitud, desde dentro de un string?"
Pues bien, ante todo lo importante es tranqulizar al desarrollador y explicarle las cosas con el siguiente ejemplo:
1) En un variable llamada @document, tenemos un string dentro del cual debemos aislar y extraer una cifra de longitud variable que se encuentra luego del string "fee=".
Veamos...
DECLARE @document varchar(64)
SELECT @document =
'123456;fee=260900;fee_SMT_Bycycle'
La cifra a extraer es "260900" en este caso.
La cosa no sería compleja si sabemos que siempre la cifra tendrá la misma longitud... (para el ejemplo 6 caractered). Nos podríamos arreglar en ese caso con esta simple query que combina las funciones Substring y Charindex (cuya sintaxis excede el contenido de este artículo)
SELECT SUBSTRING (@Document, (CHARINDEX('fee=', @document)+4), 6)
Resultado 260900
Pero dijimos que la cifra no siempre va a tener 6 caracteres, puede que tenga más o menos... Uyyyy pero esto es complicado! No no amigos, a no marearse. La solución pasa por buscar un punto de referencia que nos indique la posición dentro de la cadena donde está el string (en este caso la cifra), que queremos extraer y otra referencia que nos marque la posición dentro de la cadena en donde finaliza dicho string (cifra).
Ok .. manos a la obra...
- Posición en donde empieza el string... Pues sabemos que empieza luego del "fee=". Con lo cual podemos obtener su ubicación con un simple charindex a saber:
SELECT (CHARINDEX('fee=', @document)+4) -- comienza en la posición 12
- Posición donde termina el string... Aquí les propongo utilizar como referencia el ';' ubicado ni bien termina la cifra.
Y uds. me dirán... "Pero Gustavo, hay más de un punto y coma ';' en el string!!! Cómo haremos para saber la posición del ';' que da finalización a la cifra????" Y aquí es donde el tercer parámetro (opcional), de la función CHARINDEX nos va dar una enorme mano... Cómo? Indicando que comience a buscar el ';' luego de la posición del string "'fee='. Veamos:
SELECT CHARINDEX (';', @document, CHARINDEX('fee=', @document)) -- el punto y coma se encuentra en la posición 18
- Ahora si... sacando la diferencia entre la posición de fin y la posición de comienzo del string a aislar (de la cifra para nuestro ejemplo), podremos extraerlo siemrpe más allá de su longitud. Cómo? Sencillo .. Utilizando la función SUBSTRING sobre la cadena. Marcándole como lugar de comienzo (CHARINDEX('fee=', @document)+4)y como longitud a abstraer aquella que nos da la la diferencia de los dos charindex utilizados es decir... CHARINDEX (';', @document, CHARINDEX('fee=', @document))- (CHARINDEX('fee=', @document)+4)
VAMOS YA MISMO LA SOLUCION DEL PROBLEMA PLANTEADO!! CON EL EJEMPLO COMPLETO:
-- String
Inicial -- (desafío extraer la cifra de logitud variable luego del
"fee="
DECLARE @document varchar(64)
SELECT @document =
'123456;fee=260900;fee_SMT_Bycycle'
--Con el uso del
Substring y los charindex explicados extraemos la cadena
select SUBSTRING (@document, (CHARINDEX('fee=', @document)+4) , CHARINDEX (';', @document, CHARINDEX('fee=', @document))- (CHARINDEX('fee=', @document)+4))
RESULTADO 260900
Amigos, les animo a que prueben la solución y me hagan las preguntas que crean pertinentes.
Un saludo cordial desde Argentina.