Categorias:

Funções de cadeia de caracteres e binários (Correspondência/Comparação)

POSITION

Procura a primeira ocorrência do primeiro argumento no segundo argumento e, se bem-sucedido, retorna a posição (baseada em 1) do primeiro argumento no segundo argumento.

Aliases

CHARINDEX

Observe que a função CHARINDEX não oferece suporte a uma das variações de sintaxe que a função POSITION suporta.

Sintaxe

POSITION( <expr1>, <expr2> [ , <start_pos> ] )

POSITION( <expr1> IN <expr2> )
Copy

Argumentos

Obrigatório:

expr1

Uma cadeia de caracteres ou expressão binária representando o valor a ser buscado.

expr2

Uma cadeia de caracteres ou expressão binária representando o valor a ser pesquisado.

Opcional:

start_pos

Um número indicando a posição de onde iniciar a busca (com 1 representando o início de expr2).

Padrão: 1

Notas de uso

  • Se algum argumento for NULL, a função retorna NULL.

  • Se a cadeia de caracteres ou valor binário não for encontrado, a função retorna 0.

  • Se o opcional especificado start_pos estiver além do fim do segundo argumento (a cadeia de caracteres a pesquisar), a função retornará 0.

  • Se o primeiro argumento estiver vazio (por exemplo, uma cadeia de caracteres vazia), a função retorna 1.

  • Os tipos de dados dos dois primeiros argumentos devem ser os mesmos; ou ambos devem ser cadeias de caracteres ou ambos devem ser valores binários.

Detalhes do agrupamento

Esta função não oferece suporte às seguintes especificações de agrupamento:

  • lower.

  • upper.

  • pi (não identifica pontuação).

  • cs-ai (diferencia maiúsculas e minúsculas, não identifica acentos).

Exemplos

Expressões VARCHAR

Encontrar a primeira ocorrência de ‘an’ em ‘banana’:

select position('an', 'banana', 1);
+-----------------------------+
| POSITION('AN', 'BANANA', 1) |
|-----------------------------|
|                           2 |
+-----------------------------+
Copy

Encontrar a primeira ocorrência de ‘an’ em ‘banana’ na ou após a posição 3. Esta busca encontra a segunda ocorrência de ‘an’.

select position('an', 'banana', 3);
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
|                           4 |
+-----------------------------+
Copy

Procurar por vários caracteres, incluindo caracteres unicode, em cadeias de caracteres:

SELECT n, h, POSITION(n in h) FROM pos;

+--------+---------------------+------------------+
| N      | H                   | POSITION(N IN H) |
|--------+---------------------+------------------|
|        |                     |                1 |
|        | sth                 |                1 |
| 43     | 41424344            |                5 |
| a      | NULL                |             NULL |
| dog    | catalog             |                0 |
| log    | catalog             |                5 |
| lésine | le péché, la lésine |               14 |
| nicht  | Ich weiß nicht      |               10 |
| sth    |                     |                0 |
| ☃c     | ☃a☃b☃c☃d            |                5 |
| ☃☃     | bunch of ☃☃☃☃       |               10 |
| ❄c     | ❄a☃c❄c☃             |                5 |
| NULL   | a                   |             NULL |
| NULL   | NULL                |             NULL |
+--------+---------------------+------------------+
Copy

Expressões BINARY

Observe que como os valores abaixo são representações hexadecimais, um único byte BINARY é representado como dois dígitos hexadecimais.

Neste exemplo, o valor retornado será 3 porque ‘EF’ corresponde ao terceiro byte (o primeiro byte é ‘AB’; o segundo byte é ‘CD’ e o terceiro byte é ‘EF’):

select position(X'EF', X'ABCDEF');
+----------------------------+
| POSITION(X'EF', X'ABCDEF') |
|----------------------------|
|                          3 |
+----------------------------+
Copy

Neste exemplo, não há correspondência. Embora a sequência ‘BC’ pareça estar no valor pesquisado, o ‘B’ é o segundo nibble do primeiro byte, e o ‘C’ é o primeiro nibble do segundo byte; nenhum byte contém realmente ‘BC’, portanto o valor retornado será 0 (não encontrado).

select position(X'BC', X'ABCD');
+--------------------------+
| POSITION(X'BC', X'ABCD') |
|--------------------------|
|                        0 |
+--------------------------+
Copy