SQL rimuove il testo e lo converte in intero
Domanda
Nel mio database (SQL 2005) ho un campo che contiene un commento ma nel commento ho un ID e vorrei eliminare solo l'id, e SE possibile convertirlo in un int:
attivazione riuscita dell'ID 1010101
La riga sopra è la struttura esatta dei dati nel campo db.
E no, non voglio farlo nel codice dell'applicazione, in realtà non voglio toccarlo, nel caso ti stavi chiedendo ;-)
Soluzione
Questo dovrebbe fare il trucco:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table
In base ai dati di esempio, ciò indica che esiste una sola occorrenza di un numero intero nella stringa e che è alla fine.
Altri suggerimenti
Non ho i mezzi per testarlo al momento, ma:
select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
Saresti aperto a scrivere un po 'di codice? Un'opzione, creare una funzione definita dall'utente CLR, quindi utilizzare Regex. Puoi trovare maggiori dettagli qui . Questo gestirà stringhe complesse.
Se la riga sopra è sempre formattata come 'attivazione riuscita dell'id #######', con il tuo numero alla fine del campo, allora:
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]
Ti darà:
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
Aggiungo anche che questo approccio è più basato su set e quindi più efficiente per un sacco di valori di dati. Ma è super facile farlo solo per un valore come variabile. Invece di usare il commento della colonna puoi usare una variabile come @chvComment
.
Se la stringa di commento è ESATTAMENTE simile a quella, puoi usare sostituisci.
select replace(comment_col, 'activation successful of id ', '') as id from ....
Quasi certamente non lo sarà però: che dire delle attivazioni fallite? Potresti finire con istruzioni di sostituzione nidificate
select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....
[scusa non posso dire da questa schermata di modifica se è interamente valido sql]
Questo inizia a diventare confuso; potresti prendere in considerazione la creazione di una funzione e l'inserimento delle istruzioni di sostituzione.
Se questo è un lavoro una tantum, non importa davvero. Potresti anche usare un regex, ma è piuttosto lento (e in ogni caso significa che ora hai 2 problemi).