terça-feira, 15 de junho de 2010

Usando as funções SUBSTRING , CHARINDEX e LEN

Substring e Charindex são funções de manipulação de strings.

CHARINDEX - Retorna a posição inicial onde a string ("String a ser pesquisada") foi encontrada no texto. Se a tring não for encontrada, a função retorna zero.

Sintaxe: Charindex("String a ser pesquisada",texto)
Exemplo: Select Charindex('a', 'Brasil')
Resultado: 3

SUBSTRING - Retorna uma string com o tamanho definido em "posição final", extraída da string "texto", a partir da "posição inicial".

Sintaxe: Substring("texto", "posição inicial", "posição final")
Exemplo: Select Substring('Brasil hexa campeão', 1, 6)
Resultado: Brasil

LEN - Retorna o tamanho da string informada.

Sintaxe: LEN (string)
Exemplo: Select Len('A copa do mundo é nossa')
Resultado: 23

Um exemplo utilizando as três funções:

Tenho uma coluna (ano) em uma tabela (Copa_Mundo) que possui dados da seguinte forma: 2008_2010 .
Preciso fazer uma consulta que traga esses dados a partir do primeiro caracter depois do '_' até o final da string.

Ficaria assim:

SELECT substring(ano, (charindex('_', ano)+1), LEN (ano)) AS Ano
from Copa_mundo

Resultado:


6 comentários:

  1. Respostas
    1. SELECT substring(ano, 0, LEN(ano) - charindex('_', ano) + 1) AS Ano from Copa_mundo

      Excluir
    2. depois do (ano,...) é um 0? e esse +1 no final do parenteses, o que significa?

      Excluir
    3. Este comentário foi removido pelo autor.

      Excluir
    4. Na verdade era pra ser um 0 (zero), e não a letra o.
      Mas usar zero também é errado, porque o índice dos caracteres em uma string é começa em 1 no sql:
      1|2|3|4|5|6|7|8|9
      2|0|0|8|_|2|0|1|0
      Portanto, o correto seria:
      SELECT
      substring(ano, 1, LEN(ano) - charindex('_', ano)) AS Ano
      FROM Copa_mundo

      Excluir
  2. Se eu tenho os dados em uma string "abcde_efg_0012345_hijklm.txt"
    Quero pegar apenas o '0012345' como faria?
    Usei seu exemplo e consegui pegar '0012345_hijklm.txt' o final nao estou conseguindo tirar.
    Desde já, agradeço.

    ResponderExcluir