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: