- Categorias:
Funções de cadeia de caracteres e binários (Correspondência/Comparação)
SUBSTR , SUBSTRING¶
Retorna a parte da cadeia de caracteres ou valor binário de base_expr
, começando pelo caractere/byte especificado por start_expr
, com comprimento opcionalmente limitado.
Estas funções são sinônimas.
Sintaxe¶
SUBSTR( <base_expr>, <start_expr> [ , <length_expr> ] )
SUBSTRING( <base_expr>, <start_expr> [ , <length_expr> ] )
Argumentos¶
base_expr
Uma expressão que é avaliada como um valor VARCHAR ou BINARY.
start_expr
Uma expressão que é avaliada como um inteiro. Especifica o offset a partir do qual a subcadeia de caracteres começa. O offset é medido em:
O número de caracteres UTF-8 se a entrada for um valor VARCHAR.
O número de bytes se a entrada for um valor BINARY.
A posição inicial é baseada em 1, não em 0. Por exemplo,
SUBSTR('abc', 1, 1)
retornaa
, nãob
.length_expr
Uma expressão que é avaliada como um inteiro. Especifica:
O número de caracteres UTF-8 a retornar se a entrada for VARCHAR.
O número de bytes a retornar se a entrada for BINARY.
Especifique um comprimento maior ou igual a zero. Se o comprimento for um número negativo, a função retorna uma cadeia de caracteres vazia.
Retornos¶
O tipo de dados do valor retornado é o mesmo que o tipo de dados do base_expr
(VARCHAR ou BINARY).
Se qualquer uma das entradas for NULL, NULL será retornado.
Notas de uso¶
Se
length_expr
for especificado, atélength_expr
caracteres/bytes serão retornados. Selength_expr
não for especificado, todos os caracteres até o final da cadeia de caracteres ou valor binário serão retornados.Os valores em
start_expr
começam a partir de 1:Se 0 for especificado, ele será tratado como 1.
Se um valor negativo for especificado, a posição inicial é calculada como os
start_expr
caracteres/bytes a partir do final da cadeia de caracteres ou valor binário. Se a posição estiver fora do intervalo de uma cadeia de caracteres ou valor binário, um valor vazio é devolvido.
Detalhes do agrupamento¶
O agrupamento se aplica às entradas VARCHAR. O agrupamento não se aplica se o tipo de dados de entrada do primeiro parâmetro for BINARY.
No impact. Embora o agrupamento seja aceito sintaticamente, os agrupamentos não afetam o processamento. Por exemplo, letras de dois e três caracteres em idiomas (por exemplo, «dzs» em húngaro ou «ch» em tcheco) ainda são contadas como dois ou três caracteres (não um caractere) para o argumento de comprimento.
The collation of the result is the same as the collation of the input. Isso pode ser útil se o valor retornado for passado para outra função como parte de chamadas de funções aninhadas.
Exemplos¶
Os exemplos a seguir usam a função SUBSTR.
Exemplo básico¶
O exemplo a seguir usa a função SUBSTR para retornar a parte da cadeia de caracteres que começa no nono caractere e limita o comprimento do valor retornado a três caracteres:
SELECT SUBSTR('testing 1 2 3', 9, 3);
+-------------------------------+
| SUBSTR('TESTING 1 2 3', 9, 3) |
|-------------------------------|
| 1 2 |
+-------------------------------+
Especificação de diferentes valores de início e comprimento¶
O exemplo a seguir mostra as substrings retornadas para a mesma base_expr
quando valores diferentes são especificados para start_expr
e length_expr
:
CREATE OR REPLACE TABLE test_substr (
base_value VARCHAR,
start_value INT,
length_value INT)
AS SELECT
column1,
column2,
column3
FROM
VALUES
('mystring', -1, 3),
('mystring', -3, 3),
('mystring', -3, 7),
('mystring', -5, 3),
('mystring', -7, 3),
('mystring', 0, 3),
('mystring', 0, 7),
('mystring', 1, 3),
('mystring', 1, 7),
('mystring', 3, 3),
('mystring', 3, 7),
('mystring', 5, 3),
('mystring', 5, 7),
('mystring', 7, 3),
('mystring', NULL, 3),
('mystring', 3, NULL);
SELECT base_value,
start_value,
length_value,
SUBSTR(base_value, start_value, length_value) AS substring
FROM test_substr;
+------------+-------------+--------------+-----------+
| BASE_VALUE | START_VALUE | LENGTH_VALUE | SUBSTRING |
|------------+-------------+--------------+-----------|
| mystring | -1 | 3 | g |
| mystring | -3 | 3 | ing |
| mystring | -3 | 7 | ing |
| mystring | -5 | 3 | tri |
| mystring | -7 | 3 | yst |
| mystring | 0 | 3 | mys |
| mystring | 0 | 7 | mystrin |
| mystring | 1 | 3 | mys |
| mystring | 1 | 7 | mystrin |
| mystring | 3 | 3 | str |
| mystring | 3 | 7 | string |
| mystring | 5 | 3 | rin |
| mystring | 5 | 7 | ring |
| mystring | 7 | 3 | ng |
| mystring | NULL | 3 | NULL |
| mystring | 3 | NULL | NULL |
+------------+-------------+--------------+-----------+
Como retornar substrings para cadeias de caracteres de e-mail, telefone e data¶
Os exemplos a seguir retornam substrings para informações do cliente em uma tabela.
Crie a tabela e insira os dados:
CREATE OR REPLACE TABLE customer_contact_example (
cust_id INT,
cust_email VARCHAR,
cust_phone VARCHAR,
activation_date VARCHAR)
AS SELECT
column1,
column2,
column3,
column4
FROM
VALUES
(1, 'some_text@example.com', '800-555-0100', '20210320'),
(2, 'some_other_text@example.org', '800-555-0101', '20240509'),
(3, 'some_different_text@example.net', '800-555-0102', '20191017');
SELECT * from customer_contact_example;
+---------+---------------------------------+--------------+-----------------+
| CUST_ID | CUST_EMAIL | CUST_PHONE | ACTIVATION_DATE |
|---------+---------------------------------+--------------+-----------------|
| 1 | some_text@example.com | 800-555-0100 | 20210320 |
| 2 | some_other_text@example.org | 800-555-0101 | 20240509 |
| 3 | some_different_text@example.net | 800-555-0102 | 20191017 |
+---------+---------------------------------+--------------+-----------------+
Use a função POSITION com a função SUBSTR para extrair os domínios dos endereços de e-mail. Este exemplo encontra a posição de @
em cada cadeia de caracteres e começa a partir do próximo caractere adicionando um:
SELECT cust_id,
cust_email,
SUBSTR(cust_email, POSITION('@' IN cust_email) + 1) AS domain
FROM customer_contact_example;
+---------+---------------------------------+-------------+
| CUST_ID | CUST_EMAIL | DOMAIN |
|---------+---------------------------------+-------------|
| 1 | some_text@example.com | example.com |
| 2 | some_other_text@example.org | example.org |
| 3 | some_different_text@example.net | example.net |
+---------+---------------------------------+-------------+
Dica
É possível usar a função POSITION para encontrar a posição de outros caracteres, como um caractere vazio (' '
) ou um sublinhado (_
).
Na coluna cust_phone
da tabela, o código de área são sempre os três primeiros caracteres. Extraia o código de área dos números de telefone:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 1, 3) AS area_code
FROM customer_contact_example;
+---------+--------------+-----------+
| CUST_ID | CUST_PHONE | AREA_CODE |
|---------+--------------+-----------|
| 1 | 800-555-0100 | 800 |
| 2 | 800-555-0101 | 800 |
| 3 | 800-555-0102 | 800 |
+---------+--------------+-----------+
Remova o código de área dos números de telefone:
SELECT cust_id,
cust_phone,
SUBSTR(cust_phone, 5) AS phone_without_area_code
FROM customer_contact_example;
+---------+--------------+-------------------------+
| CUST_ID | CUST_PHONE | PHONE_WITHOUT_AREA_CODE |
|---------+--------------+-------------------------|
| 1 | 800-555-0100 | 555-0100 |
| 2 | 800-555-0101 | 555-0101 |
| 3 | 800-555-0102 | 555-0102 |
+---------+--------------+-------------------------+
Na coluna activation_date
da tabela, a data está sempre no formato YYYYMMDD
. Extraia o ano, mês e dia destas cadeias de caracteres:
SELECT cust_id,
activation_date,
SUBSTR(activation_date, 1, 4) AS year,
SUBSTR(activation_date, 5, 2) AS month,
SUBSTR(activation_date, 7, 2) AS day
FROM customer_contact_example;
+---------+-----------------+------+-------+-----+
| CUST_ID | ACTIVATION_DATE | YEAR | MONTH | DAY |
|---------+-----------------+------+-------+-----|
| 1 | 20210320 | 2021 | 03 | 20 |
| 2 | 20240509 | 2024 | 05 | 09 |
| 3 | 20191017 | 2019 | 10 | 17 |
+---------+-----------------+------+-------+-----+