Buscar
  • Ignez Mello

PATINDEX, LIKE e máscaras

A função PATINDEX oferece algumas opções bem poderosas, mas é bem fácil montar uma condição que dá errado. Ela é usada para localizar a posição do texto numa string, usando coringas como o operador LIKE, retornando um valor INT. Depois de sofrer um pouco para atender algumas regras bem estranhas e conseguir fazer uma leitura 95% confiável de uma coluna que, pode-se dizer, foi preenchida por um gato dormindo no teclado, escrevi esse post para guardar e compartilhar algumas dicas.

O grande truque para usar PATINDEX é justamente a configuração de máscaras que podemos aplicar. Como mencionado acima, são os mesmo modelos usados com LIKE. A diferença é que LIKE retorna verdadeiro ou falso, e PATINDEX retorna o primeiro caractere da string pesquisada.

Tanto PATINDEX como LIKE utilizam máscaras para definir que informação localizar:


Este é um exemplo simples:


Com a máscara %, podemos determinar em qual posição da string queremos verificar se existe uma letra B.


Esta máscara vai nos ajudar a validar se a string informada é um endereço IP:


Podemos usar essa máscara para validar se o formato do IP foi passado corretamente:


Para o SQL, os dois comandos tem o mesmo custo. Quando usar um ou outro vai da nossa necessidade. Podemos usar o LIKE para validar o formato, e o PATINDEX quando precisamos localizá-lo e usar sua posição.


E se pudermos melhorar a validação, garantindo que apenas números e pontos sejam informados na string de IP:



Com o uso de colchetes, informamos que antes de cada ponto tem que vir um número. Vi este exemplo num blog inglês, e demorei alguns minutos para entender sua aplicação e, principalmente, seu resultado. O objetivo aqui é localizar uma sequência de 3 caracteres numéricos no texto. No caso do texto não ter uma sequência, ‘000’ (incluído no final do texto) é retornado, mantendo o resultado da função coerente.


O retorno da substring é 147.


Observe a máscara utilizada. Ela valida 5 caracteres em sequência, em qualquer posição do texto, mas com duas validações diferentes:

  • [^0-9] – qualquer caractere EXCETO a sequência de 0 a 9

  • [0-9] – qualquer caractere DENTRO da sequência de 0 a 9


Ok, vamos por partes, vamos ler a máscara:

  • Procurar uma sequência de 5 caracteres

  • O primeiro caractere pode ser qualquer coisa exceto números de 0 a 9

  • O segundo, terceiro e quarto caractere tem que ser qualquer número de 0 a 9

  • O quinto caractere pode ser qualquer coisa exceto números de 0 a 9.


E quando a necessidade é localizar o % na string? Aí usamos os colchetes, que avisa ao SQL para considerar os caracteres utilizados como máscara (como % e _), apenas como caracteres!


Lembre-se, a função vai procurar a sequência de caracteres dentro da máscara, e retornar a posição do primeiro caractere encontrado.


Outra opção no uso de colchetes é definir intervalos ou conjuntos de valores:


Neste último exemplo, vamos validar um código formado por 2 letras, 1 número, 1 espaço, 1 número e duas letras:





0 visualização