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

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top