texto tira SQL e converter para inteiro
Pergunta
No meu banco de dados (SQL 2005) Eu tenho um campo que contém um comentário, mas no comentário que tenho um id e eu gostaria de retirar apenas o id, e se possível convertê-lo em um int:
activation successful of id 1010101
A linha de cima representa a estrutura exacta dos dados no campo db.
E não, eu não quero fazer isso no código do aplicativo, eu realmente não quero tocá-lo, apenas no caso de você estar se perguntando; -)
Solução
Isso deve fazer o truque:
SELECT SUBSTRING(column, PATINDEX('%[0-9]%', column), 999)
FROM table
Com base em seus dados de amostra, este que só há uma ocorrência de um número inteiro na corda e que é no final.
Outras dicas
Eu não tenho um meio para testá-lo no momento, mas:
select convert(int, substring(fieldName, len('activation successful of id '), len(fieldName) - len('activation successful of id '))) from tableName
Você estaria aberto a escrever um pouco de código? Uma opção, criar uma função CLR definido pelo usuário, em seguida, usar Regex. Você pode encontrar mais detalhes aqui . Isto irá lidar com cordas complexas.
Se a sua linha acima é sempre formatado como 'ativação bem-sucedida de id #######', com o seu número no final do campo e, em seguida:
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]
Vamos dar-lhe:
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
Eu também gostaria de acrescentar que esta abordagem é mais definido com base e, portanto, mais eficiente para um monte de valores de dados. Mas é super fácil de fazê-lo apenas por um valor como uma variável. Em vez de usar o comentário coluna você pode usar uma variável como @chvComment
.
Se a cadeia de comentário é exatamente como que você pode usar substituir.
select replace(comment_col, 'activation successful of id ', '') as id from ....
É quase certo que não será no entanto - que sobre Ativações sem sucesso? Você pode acabar com nested substituir declarações
select replace(replace(comment_col, 'activation not successful of id ', ''), 'activation successful of id ', '') as id from ....
[desculpe não posso dizer a partir desta tela de edição se isso é sql inteiramente válida]
Isso começa a ficar confuso; você pode considerar a criação de uma função e colocar a declarações substituir nisso.
Se este é um fora de trabalho, não vai realmente importa. Você também pode usar um regex, mas isso é bastante lento (e em qualquer caso significa que agora você tem 2 problemas).