2008-09-19 11 views
1

Dans ma base de données (SQL 2005) j'ai un champ qui contient un commentaire mais dans le commentaire j'ai un ID et je voudrais enlever juste l'ID, et SI possible le convertir en int:Texte de la bande SQL et convertir en nombre entier

activation successful of id 1010101

la ligne ci-dessus est la structure exacte des données dans le champ db.

Et non, je ne veux pas faire cela dans le code de l'application, je ne veux pas vraiment le toucher, juste au cas où vous vous demandiez ;-)

+0

Vous voulez modifier le champ dans la db avoir seulement le numéro d'identification et de rendre le champ un int? Je ne sais pas ce que vous faites. –

+0

Sur select je voudrais juste avoir le numéro (le dépouiller des données dans le champ), je ne veux pas changer le champ de DB. – Symbioxys

Répondre

1

Cela devrait faire l'affaire:

SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999) 
FROM table 

Sur la base de données d'échantillons, ce qu'il est une seule occurrence d'un entier dans la chaîne et qu'elle est à la fin.

0
-- 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 

Je voudrais aussi ajoutez que cette approche est plus basée sur l'ensemble et donc plus efficace pour un tas de valeurs de données. Mais il est super facile de le faire juste pour une valeur en tant que variable. Au lieu d'utiliser le commentaire de colonne, vous pouvez utiliser une variable comme @chvComment.

0

Je n'ai pas un moyen de le tester au moment, mais:

select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName 
0

Si la chaîne de commentaire est EXACTEMENT comme cela, vous pouvez utiliser remplacer.

select replace(comment_col, 'activation successful of id ', '') as id from .... 

Il ne sera certainement pas le cas - qu'en est-il des Activations infructueuses? Vous pourriez vous retrouver avec imbriqué REPLACE

select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from .... 

[désolé ne peut pas dire de cet écran d'édition si c'est tout à fait valable sql]

qui commence à se salir; vous pourriez envisager de créer une fonction et de placer les instructions de remplacement dans celle-ci.

S'il s'agit d'un travail ponctuel, cela n'aura pas vraiment d'importance. Vous pouvez également utiliser une regex, mais c'est assez lent (et en tout cas cela signifie que vous avez maintenant 2 problèmes).

0

Seriez-vous prêt à écrire un peu de code? Une option, créez une fonction CLR définie par l'utilisateur, puis utilisez Regex. Vous pouvez trouver plus de détails here. Cela va gérer les chaînes complexes.

Si votre ligne ci-dessus est toujours formaté comme « l'activation réussie de id ####### », avec votre numéro à la fin du champ, puis:

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] 

vous donnera:

OriginalColumn       DesiredColumn 
---------------------------------------- ------------- 
activation successful of id 1010102  1010102 

(1 row(s) affected) 
0
CAST(REVERSE(LEFT(REVERSE(@Test),CHARINDEX(' ',REVERSE(@Test))-1)) AS INTEGER) 
0
select cast(right(column_name,charindex(' ',reverse(column_name))) as int) 
Questions connexes