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 ;-)

¿Fue útil?

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).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top