Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função INSTR() no Oracle


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: