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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top