No Oracle, o
INSTR()
A função procura uma substring em uma determinada string e retorna um inteiro indicando a posição do primeiro caractere dessa substring. Se a substring não for encontrada, a função retornará 0
. INSTR()
requer pelo menos dois argumentos; a string e a substring. Ele também aceita um terceiro e quarto argumentos opcionais que permitem especificar a posição inicial a ser pesquisada e qual ocorrência pesquisar. INSTR()
também pode ser pensado como um grupo de funções. Existem cinco funções separadas; INSTR()
, INSTRB()
, INSTRC()
, INSTR2()
e INSTR4()
. Cada função calcula o comprimento de uma maneira diferente. Sintaxe
A sintaxe fica assim:
{ INSTR
| INSTRB
| INSTRC
| INSTR2
| INSTR4
}
(string , substring [, position [, occurrence ] ])
Onde
string
é a string a ser pesquisada, substring
é a substring a ser encontrada, position
é a posição inicial da substring e occurrence
é qual ocorrência encontrar. As funções calculam os comprimentos da seguinte forma:
Função | Calcula o comprimento usando… |
---|---|
INSTR() | Caracteres definidos pelo conjunto de caracteres de entrada, com o primeiro caractere da string na posição 1. |
INSTRB() | Bytes |
INSTRC() | Caracteres completos Unicode |
INSTR2() | Pontos de código UCS2 |
INSTR4() | Pontos de código UCS4 |
Exemplo
Segue um exemplo básico:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Resultado:
5
Comparado com INSTRB()
Este exemplo mostra como os resultados podem diferir, dependendo de qual função específica você está usando e do conjunto de caracteres envolvido.
Neste caso, comparamos
INSTR()
com INSTRB()
:SELECT
INSTR('Böyük yağlı pişik', 'yağlı') AS INSTR,
INSTRB('Böyük yağlı pişik', 'yağlı') AS INSTRB
FROM DUAL;
Resultado:
INSTR INSTRB ________ _________ 7 9
Podemos ver que as duas funções retornaram dois resultados diferentes. Isso ocorre porque alguns caracteres nessa string usam dois bytes.
O
INSTR()
A função retorna a posição conforme definida pelo conjunto de caracteres de entrada, enquanto a função INSTRB()
função retorna a posição baseada em bytes . Se retornarmos à string original, os resultados são os mesmos entre as duas funções:
SELECT
INSTR('Big fat cat', 'fat') AS INSTR,
INSTRB('Big fat cat', 'fat') AS INSTRB
FROM DUAL;
Resultado:
INSTR INSTRB ________ _________ 5 5
Isso porque essa string usa apenas um byte por caractere e, portanto, o comprimento em bytes é igual ao número de caracteres.
Posição inicial
Aqui está um exemplo que especifica a posição para a qual iniciar a pesquisa:
SELECT INSTR('That fat cat', 'at', 8)
FROM DUAL;
Resultado:
11
Nesse caso, a busca começa na posição 8, que fica após as duas primeiras ocorrências. Portanto, obtemos a posição da terceira partida.
Especifique qual ocorrência
Aqui está um exemplo de especificação de qual ocorrência encontrar:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Resultado:
7
Nesse caso, começamos na posição 1 e, em seguida, procuramos a segunda ocorrência a partir dessa posição inicial.
Aqui está novamente, mas desta vez comparamos três valores diferentes para a
occurrence
argumento:SELECT
INSTR('That fat cat', 'at', 1, 1) AS "o1",
INSTR('That fat cat', 'at', 1, 2) AS "o2",
INSTR('That fat cat', 'at', 1, 3) AS "o3"
FROM DUAL;
Resultado:
o1 o2 o3 _____ _____ _____ 3 7 11
Mas eis o que acontece se aumentarmos a
position
argumento:SELECT
INSTR('That fat cat', 'at', 5, 1) AS "o1",
INSTR('That fat cat', 'at', 5, 2) AS "o2",
INSTR('That fat cat', 'at', 5, 3) AS "o3"
FROM DUAL;
Resultado:
o1 o2 o3 _____ _____ _____ 7 11 0
Nesse caso, não obtemos a posição da primeira ocorrência, pois ela está localizada antes da nossa posição inicial. Também recebemos
0
na terceira coluna porque não há terceira ocorrência, com base em nossa posição inicial. Posição negativa
Especificar um valor negativo para a posição faz com que a posição inicial seja contada para trás a partir do final da string e para o Oracle pesquisar para trás a partir dessa posição:
SELECT INSTR('That fat cat', 'at', -3)
FROM DUAL;
Resultado:
7
E qualquer ocorrência especificada é contada para trás a partir dessa posição:
SELECT INSTR('That fat cat', 'at', -3, 2)
FROM DUAL;
Resultado:
3
Argumentos nulos
Se algum (ou todos) dos argumentos for
null
, o resultado é null
:SET NULL 'null';
SELECT
INSTR(null, 'f', 1, 1) AS r1,
INSTR('Coffee', null, 1, 1) AS r2,
INSTR('Coffee', 'f', null, 1) AS r3,
INSTR('Coffee', 'f', 1, null) AS r4
FROM DUAL;
Resultado:
R1 R2 R3 R4 _______ _______ _______ _______ null null null null
Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que
null
ocorre como resultado de um SQL SELECT
demonstração. No entanto, você pode usar
SET NULL
para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null
deve ser devolvido. Contagem incorreta de argumentos
Chamando
INSTR()
sem passar nenhum argumento resulta em um erro:SELECT INSTR()
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT INSTR() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00938: not enough arguments for function 00938. 00000 - "not enough arguments for function" *Cause: *Action:
E passar muitos argumentos também resulta em um erro:
SELECT INSTR('Big fat cat', 'at', 1, 2, 3)
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT INSTR('Big fat cat', 'at', 1, 2, 3) FROM DUAL Error at Command Line : 1 Column : 38 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: