SQL elimina el texto y lo convierte a un número entero
Pregunta
En mi base de datos (SQL 2005) tengo un campo que contiene un comentario, pero en el comentario tengo una identificación y me gustaría eliminar solo la identificación y, si es posible, convertirla a un int:
activation successful of id 1010101
La línea de arriba es la estructura exacta de los datos en el campo db.
Y no, no quiero hacer esto en el código de la aplicación, en realidad no quiero tocarlo, por si te lo preguntaste ;-)
Solución
Esto debería funcionar:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table
Según sus datos de muestra, esto significa que solo hay una aparición de un número entero en la cadena y que está al final.
Otros consejos
No tengo medios para probarlo en este momento, pero:
select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
¿Estarías dispuesto a escribir un poco de código?Una opción: crear una función CLR definida por el usuario y luego usar Regex.Puedes encontrar más detalles aquí.Esto manejará cadenas complejas.
Si su línea anterior siempre tiene el formato 'activación exitosa de id #######', con su número al final del campo, entonces:
declare @myColumn varchar(100)
set @myColumn = 'activation successful of id 1010102'
SELECT
@myColumn as [OriginalColumn]
, CONVERT(int, REVERSE(LEFT(REVERSE(@myColumn), CHARINDEX(' ', REVERSE(@myColumn))))) as [DesiredColumn]
Te regalaré:
OriginalColumn DesiredColumn
---------------------------------------- -------------
activation successful of id 1010102 1010102
(1 row(s) affected)
select cast(right(column_name,charindex(' ',reverse(column_name))) as int)
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER)
-- Test table, you will probably use some query
DECLARE @testTable TABLE(comment VARCHAR(255))
INSERT INTO @testTable(comment)
VALUES ('activation successful of id 1010101')
-- Use Charindex to find "id " then isolate the numeric part
-- Finally check to make sure the number is numeric before converting
SELECT CASE WHEN ISNUMERIC(JUSTNUMBER)=1 THEN CAST(JUSTNUMBER AS INTEGER) ELSE -1 END
FROM (
select right(comment, len(comment) - charindex('id ', comment)-2) as justnumber
from @testtable) TT
También agregaría que este enfoque se basa más en conjuntos y, por lo tanto, es más eficiente para una gran cantidad de valores de datos.Pero es muy fácil hacerlo solo para un valor como variable.En lugar de usar el comentario de la columna, puedes usar una variable como @chvComment
.
Si la cadena de comentarios es EXACTAMENTE así, puedes usar reemplazar.
select replace(comment_col, 'activation successful of id ', '') as id from ....
Es casi seguro que no lo será. ¿Qué pasa con las activaciones fallidas?Podría terminar con declaraciones de reemplazo anidadas
select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....
[lo siento, no puedo decir en esta pantalla de edición si es un sql completamente válido]
Eso empieza a complicarse;podría considerar crear una función y poner las declaraciones de reemplazo en ella.
Si se trata de un trabajo único, realmente no importará.También podrías usar una expresión regular, pero es bastante lenta (y en cualquier caso significa que ahora tienes 2 problemas).