Texte de bande SQL et convertir en entier
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 ;-)
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).