Neste artigo vamos falar sobre algumas formas de utilizar a função Charindex.
O Charindex é uma função em SQL que retorna a primeira posição de uma sequencia de caracteres em uma determinada expressão.
Esta função está disponível na versão 2008 em diante do SQL SERVER,
Para aplicarmos essa função devemos passar ao menos duas expressões:
A primeira é o caracter que buscamos na string e a segunda é onde será feita a pesquisa. Uma variável declarada, uma coluna de tabela, etc…
A terceira é o incio da posição que queremos localizar
No exemplo abaixo como nao foi passado o inico da posição, a instrução retorna o primeiro caracter encontrado.
A primeira letra ‘A’ está na posição 1.
use tempdb
Go
Declare @texto varchar(30) = 'Alexandre DBA'
Select charindex ('A',@texto)
–Resultado: 1
–Se não for passado ao menos duas expressões, a query retornará o seguinte erro:
Declare @texto varchar(30) = 'Alexandre DBA'
Select charindex (@texto)
/*
Msg 189, Level 15, State 1, Line 21
The charindex function requires 2 to 3 arguments.
*/
–Agora vamos localizar todas as posições que a letra ‘A’ for encontrada
–No exemplo abaixo, declaramos uma nova variável ‘@posicao’, para indicar o inicio da posição que vamos utilizar para localizar todas as letras ‘A’
Declare @texto varchar(30) = 'Alexandre DBA', @posicao int
--Posição inicial
Set @posicao = 1
--Usamos o WHILE para encerrar a busca assim que a última letra for localizada,
--pois a partir da posição que não for encotrada a letra 'A', o resultado será 0.
While (Select charindex ('A',@texto,@posicao))<> 0
Begin
Select charindex ('A',@texto,@posicao) Posicao
--Aqui eu seto a posição inicial e somo a posição em que foi localizada a letra 'A'.
Set @posicao = @posicao + charindex ('A',@texto,@posicao)
End;
–Resultado: 1,5 e 13
–Agora vamos separar 3 ou mais palavras em colunas ou linhas diferentes utilizando charindex e uma ajudinha das funções substring,
–reverse e len que serão abordadas em outros artigos
Declare @texto varchar(30) = 'Alexandre DBA SQL'
Select substring (@texto,1,charindex(' ',@texto,1)),
substring(@texto,charindex(' ',@texto,1),charindex(' ',reverse(@texto),1)),
reverse(substring (reverse(@texto),1,charindex(' ',reverse(@texto),1)))
--------------------------------------------------------------------------------------
Declare @texto varchar(30) = 'Alexandre DBA SQL 2008'
Select substring (@texto,1,charindex(' ',@texto,1)),
substring(@texto,charindex(' ',@texto,1),charindex(' ',reverse(@texto),1)),
substring(@texto,charindex(' ',@texto,charindex(' ',@texto,1)+1),charindex(' ',reverse(@texto),1)),
reverse(substring (reverse(@texto),1,charindex(' ',reverse(@texto),1)))
--------------------------------------------------------------------------------------
Declare @texto varchar(30) = 'Alexandre DBA SQL 2008'
Select substring (@texto,1,charindex(' ',@texto,1)),
replace(@texto,substring (@texto,1,charindex(' ',@texto,1)),'')
--------------------------------------------------------------------------------------
Declare @texto varchar(35) = 'Alexandre Oliveira DBA SQL 2008'
Select substring (@texto,1,charindex(' ',@texto,charindex(' ',@texto,1)+1)),
replace(@texto,substring (@texto,1,charindex(' ',@texto,charindex(' ',@texto,1)+1)),'')
--------------------------------------------------------------------------------------
Declare @texto varchar(40) = 'Alexandre Oliveira Curvelo DBA SQL 2008'
Select substring (@texto,1,charindex(' ',@texto,charindex(' ',@texto,charindex(' ',@texto,1)+1)+1)),
replace(@texto,substring (@texto,1,charindex(' ',@texto,charindex(' ',@texto,charindex(' ',@texto,1)+1)+1)),'')
--Ou utilizando um delimitador
--------------------------------------------------------------------------------------
Declare @texto varchar(30) = 'Alexandre DBA SQL 2008', @delimitador char(1) = ' '
Set @texto = @texto + @delimitador
While len(@texto) > 0
Begin
Select substring(@texto, 1, charindex(@delimitador, @texto) - 1)
Select @texto = substring(@texto, charindex(@delimitador, @texto) + 1, len(@texto))
End
Bom, é isso.
No link abaixo tem informações importantes como, qual tipo de dados usar, exemplos com collate que diferencia letras maiúsculas e minúsculas…
https://msdn.microsoft.com/pt-br/library/ms186323(v=sql.100).aspx