No Oracle, o
SUBSTR()
A função retorna uma substring de uma determinada string. SUBSTR()
requer pelo menos dois argumentos; a string e a posição da qual extrair a substring. Ele também aceita um terceiro argumento opcional que permite especificar quanto tempo a substring deve ter. SUBSTR()
também pode ser pensado como um grupo de funções. Existem cinco funções separadas; SUBSTR()
, SUBSTRB()
, SUBSTRC()
, SUBSTR2()
e SUBSTR4()
. Cada função calcula o comprimento de uma maneira diferente. Sintaxe
A sintaxe fica assim:
{ SUBSTR
| SUBSTRB
| SUBSTRC
| SUBSTR2
| SUBSTR4
}
(char, position [, substring_length ])
Onde
char
é a string, position
é a posição inicial da substring e substring_length
é o comprimento dos caracteres a serem extraídos. As funções calculam os comprimentos da seguinte forma:
Função | Calcula o comprimento usando… |
---|---|
SUBSTR() | Caracteres definidos pelo conjunto de caracteres de entrada |
SUBSTRB() | Bytes |
SUBSTRC() | Caracteres completos Unicode |
SUBSTR2() | Pontos de código UCS2 |
SUBSTR4() | Pontos de código UCS4 |
Exemplo
Segue um exemplo básico:
SELECT SUBSTR('Big fat cat', 5)
FROM DUAL;
Resultado:
fat cat
Comparado com SUBSTRB()
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
SUBSTR()
com SUBSTRB()
:SELECT
SUBSTR('Böyük yağlı pişik', 5) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5) AS SUBSTRB
FROM DUAL;
Resultado:
SUBSTR SUBSTRB ________________ _________________ k yağlı pişik ük yağlı pişik
Podemos ver que as duas funções retornaram dois resultados diferentes. Isso ocorre porque alguns caracteres nessa string usam dois bytes.
O
SUBSTR()
A função retorna o comprimento em ccaracteres conforme definido pelo conjunto de caracteres de entrada, enquanto a função SUBSTRB()
função retorna o comprimento em bytes . Se retornarmos à string original, os resultados são os mesmos entre as duas funções:
SELECT
SUBSTR('Big fat cat', 5) AS SUBSTR,
SUBSTRB('Big fat cat', 5) AS SUBSTRB
FROM DUAL;
Resultado:
SUBSTR SUBSTRB __________ __________ fat cat fat cat
Isso porque essa string usa apenas um byte por caractere e, portanto, o comprimento em bytes é igual ao número de caracteres.
Comprimento da Substring
Aqui está um exemplo que especifica o comprimento da substring a ser extraída:
SELECT SUBSTR('Big fat cat', 5, 3)
FROM DUAL;
Resultado:
fat
E aqui está uma comparação entre
SUBSTR()
e SUBSTRB()
ao especificar o comprimento em caracteres de vários bytes:SELECT
SUBSTR('Böyük yağlı pişik', 5, 9) AS SUBSTR,
SUBSTRB('Böyük yağlı pişik', 5, 9) AS SUBSTRB
FROM DUAL;
Resultado:
SUBSTR SUBSTRB ____________ __________ k yağlı p ük yağl
Posição zero
Uma peculiaridade desta função é que, passando uma posição de
0
produz o mesmo resultado que passar 1
:SELECT
SUBSTR('Big fat cat', 0, 3) AS "0",
SUBSTR('Big fat cat', 1, 3) AS "1"
FROM DUAL;
Resultado:
0 1 ______ ______ Big Big
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:
SELECT SUBSTR('Big fat cat', -3)
FROM DUAL;
Resultado:
cat
E qualquer comprimento especificado é contado a partir dessa posição:
SELECT SUBSTR('Big fat cat', -7, 3)
FROM DUAL;
Resultado:
fat
Argumentos nulos
Se algum (ou todos) dos argumentos for
null
, o resultado é null
:SET NULL 'null';
SELECT
SUBSTR(null, 3, 3) AS r1,
SUBSTR('Coffee', null, 3) AS r2,
SUBSTR('Coffee', 3, null) AS r3,
SUBSTR(null, null, 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
SUBSTR()
sem passar nenhum argumento resulta em um erro:SELECT SUBSTR()
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT SUBSTR() 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 SUBSTR('Big fat cat', 3, 2, 1)
FROM DUAL;
Resultado:
Error starting at line : 1 in command - SELECT SUBSTR('Big fat cat', 3, 2, 1) FROM DUAL Error at Command Line : 1 Column : 36 Error report - SQL Error: ORA-00939: too many arguments for function 00939. 00000 - "too many arguments for function" *Cause: *Action: