Question

Dans ma base de données (SQL 2005), j'ai un champ qui contient un commentaire, mais dans le commentaire, j'ai un identifiant et je voudrais effacer uniquement l'identifiant, et SI possible, le convertir en int:

activation réussie de l'identifiant 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 en fait pas y toucher, juste au cas où vous vous le demanderiez ;-)

Était-ce utile?

La solution

Cela devrait faire l'affaire:

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

Sur la base de vos exemples de données, cela signifie qu'il n'y a qu'une seule occurrence d'un entier dans la chaîne et qu'elle se trouve à la fin.

Autres conseils

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

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

Seriez-vous prêt à écrire un peu de code? Une option, créer une fonction définie par l'utilisateur CLR, puis utiliser Regex. Vous pouvez trouver plus de détails sur ici . Ceci gérera des chaînes complexes.

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

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

J'ajouterais que cette approche est davantage basée sur les ensembles et donc plus efficace pour un tas de valeurs de données. Mais il est très 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 telle que @chvComment .

Si la chaîne de commentaire est EXACTEMENT comme ça, vous pouvez utiliser le remplacement.

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

Cela ne sera presque certainement pas le cas - qu'en est-il des activations infructueuses? Vous pourriez vous retrouver avec des instructions de remplacement imbriquées

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

[désolé je ne peux pas dire à partir de cet écran d'édition si c'est entièrement valide SQL]

Cela commence à devenir désordonné; vous pourriez envisager de créer une fonction et d'y placer les instructions de remplacement.

S'il s'agit d'un travail ponctuel, ce n'est pas grave. Vous pouvez également utiliser une expression rationnelle, mais c'est assez lent (et de toute façon, vous avez maintenant 2 problèmes).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top