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.

Se você precisar encontrar a posição além da primeira ocorrência (por exemplo, a terceira ocorrência), é possível usar a função REGEXP_INSTR.

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 que indica a posição em que a pesquisa deve ser iniciada (com 1 representando o início de expr2).

Padrão: 1

Retornos

Esta função retorna um valor do tipo NUMBER.

Se algum argumento for NULL, a função retornará NULL.

Notas de uso

  • 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 retornará 1.

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

Detalhes do agrupamento

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

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

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

Exemplos

Os exemplos a seguir usam a função POSITION.

Expressões VARCHAR

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

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

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);
Copy
+-----------------------------+
| POSITION('AN', 'BANANA', 3) |
|-----------------------------|
|                           4 |
+-----------------------------+

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

SELECT n, h, POSITION(n IN h) FROM pos;
Copy
+--------+---------------------+------------------+
| 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 |
+--------+---------------------+------------------+

Expressões BINARY

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

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

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

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

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