Função SUBSTRING
Retorna o subconjunto de uma string com base na posição inicial especificada da string.
Se a entrada for uma cadeia de caracteres, a posição inicial e o número de caracteres extraídos são baseados nos caracteres, e não bytes, de forma que caracteres multibyte são contados como caracteres simples. Se a entrada for uma expressão binária, a posição inicial e a substring extraída são baseadas em bytes. Você não pode especificar um comprimento negativo, mas pode especificar uma posição inicial negativa.
Sintaxe
SUBSTRING(character_string FROM start_position [ FOR number_characters ] )
SUBSTRING(character_string, start_position, number_characters )
SUBSTRING(binary_expression, start_byte, number_bytes )
SUBSTRING(binary_expression, start_byte )
Argumentos
- character_string
-
A string a ser pesquisada. Tipos de dados não caracteres são tratados como uma string.
- start_position
-
A posição dentro da sequência para começar a extração, começando em 1. A start_position é baseada no número de caracteres, e não bytes, de forma que caracteres multibyte são contados como caracteres simples. Esse número pode ser negativo.
- number_characters
-
O número de caracteres a extrair (o comprimento da substring). O number_characters é baseado no número de caracteres, e não bytes, de forma que caracteres multibyte são contados como caracteres simples. Esse número não pode ser negativo.
- binary_expression
-
O binary_expression do tipo de dados VARBYTE a ser pesquisado.
- start_byte
-
A posição dentro da expressão binária para começar a extração, começando por 1. Esse número pode ser negativo.
- number_bytes
-
O número de bytes a serem extraídos, ou seja, o comprimento da substring. Esse número não pode ser negativo.
Tipo de retorno
VARCHAR ou VARBYTE, de acordo com a entrada.
Observações sobre o uso
Veja a seguir alguns exemplos de como você pode usar start_position e number_characters para extrair substrings de várias posições em uma string.
O seguinte exemplo retorna uma string de quatro caracteres começando com o sexto caractere.
select substring('caterpillar',6,4); substring ----------- pill (1 row)
Se start_position + number_characters exceder o comprimento da string, SUBSTRING retornará uma substring que começa na start_position e vai até o final da string. Por exemplo:
select substring('caterpillar',6,8); substring ----------- pillar (1 row)
Se start_position
for negativa ou 0, a função SUBSTRING retornará uma substring começando no primeiro caractere da string com um comprimento de start_position
+ number_characters
-1. Por exemplo:
select substring('caterpillar',-2,6); substring ----------- cat (1 row)
Se start_position
+ number_characters
-1 for menor ou igual a zero, a SUBSTRING retornará uma string vazia. Por exemplo:
select substring('caterpillar',-5,4); substring ----------- (1 row)
Exemplos
O seguinte exemplo retorna o mês da string LISTTIME na tabela LISTING:
select listid, listtime, substring(listtime, 6, 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)
O seguinte exemplo é o mesmo que o exemplo acima, mas usa a opção FROM...FOR:
select listid, listtime, substring(listtime from 6 for 2) as month from listing order by 1, 2, 3 limit 10; listid | listtime | month --------+---------------------+------- 1 | 2008-01-24 06:43:29 | 01 2 | 2008-03-05 12:25:29 | 03 3 | 2008-11-01 07:35:33 | 11 4 | 2008-05-24 01:18:37 | 05 5 | 2008-05-17 02:29:11 | 05 6 | 2008-08-15 02:08:13 | 08 7 | 2008-11-15 09:38:15 | 11 8 | 2008-11-09 05:07:30 | 11 9 | 2008-09-09 08:03:36 | 09 10 | 2008-06-17 09:44:54 | 06 (10 rows)
Não é possível usar a SUBSTRING para extrair previsivelmente o prefixo de uma string que possa conter caracteres multibyte, pois é necessário especificar o comprimento de uma string multibyte com base no número de bytes, e não no número de caracteres. Para extrair o segmento inicial de uma sequência com base no comprimento em bytes, você pode CAST a string como VARCHAR (byte_length) para truncar a string, onde byte_length é o tamanho exigido. O seguinte exemplo extrai os primeiros cinco bytes da string 'Fourscore and
seven'
.
select cast('Fourscore and seven' as varchar(5)); varchar ------- Fours
O seguinte exemplo mostra uma posição inicial negativa de um valor binário abc
. Como a posição inicial é -3, a substring é extraída do início do valor binário. O resultado é exibido automaticamente como a representação hexadecimal da substring binária.
select substring('abc'::varbyte, -3); substring ----------- 616263
O seguinte exemplo mostra 1 para a posição inicial de um valor binário abc
. Como não há tamanho especificado, a string é extraída da posição inicial até o final da string. O resultado é exibido automaticamente como a representação hexadecimal da substring binária.
select substring('abc'::varbyte, 1); substring ----------- 616263
O exemplo a seguir mostra 3 para a posição inicial de um valor binário abc
. Como não há tamanho especificado, a string é extraída da posição inicial até o final da string. O resultado é exibido automaticamente como a representação hexadecimal da substring binária.
select substring('abc'::varbyte, 3); substring ----------- 63
O exemplo a seguir mostra 2 para a posição inicial de um valor binário abc
. A string é extraída da posição inicial para a posição 10, mas o final da string está na posição 3. O resultado é exibido automaticamente como a representação hexadecimal da substring binária.
select substring('abc'::varbyte, 2, 10); substring ----------- 6263
O exemplo a seguir mostra 2 para a posição inicial de um valor binário abc
. A string é extraída da posição inicial por 1 byte. O resultado é exibido automaticamente como a representação hexadecimal da substring binária.
select substring('abc'::varbyte, 2, 1); substring ----------- 62
O exemplo a seguir retorna o nome Ana
que aparece após o último espaço na string de entrada Silva, Ana
.
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))
reverse ----------- Ana