Categorias:

Funções de cadeia de caracteres (expressões regulares)

REGEXP_COUNT

Retorna o número de vezes que um padrão ocorre em uma string.

Sintaxe

REGEXP_COUNT( <subject> ,
              <pattern>
                [ , <position>
                  [ , <parameters> ]
                ]
)
Copy

Argumentos

Obrigatório:

subject

A cadeia de caracteres a ser procurada por correspondências.

pattern

Padrão a atender.

Para diretrizes sobre como especificar padrões, consulte Funções de cadeia de caracteres (expressões regulares).

Opcional:

position

Número de caracteres desde o início da cadeia de caracteres onde a função começa a procurar correspondências.

Padrão: 1 (a busca por uma correspondência começa no primeiro caractere à esquerda)

parameters

Cadeia de caracteres de um ou mais caracteres que especifica os parâmetros usados para a busca de correspondências. Valores com suporte:

Parâmetro

Descrição

c

Correspondência com distinção entre maiúsculas e minúsculas

i

Correspondência sem distinção entre maiúsculas e minúsculas

m

Modo multilinha

e

Extração de subcorrespondências

s

O caractere curinga POSIX do modo de linha única . corresponde a \n

Padrão: c

Para obter mais detalhes, consulte Especificação dos parâmetros para a expressão regular.

Retornos

Retorna um valor do tipo NUMBER. Retorna NULL se algum argumento for NULL.

Notas de uso

Consulte Notas de uso geral para funções de expressão regular.

Detalhes do agrupamento

Arguments with collation specifications currently aren’t supported.

Exemplos

O seguinte exemplo conta as ocorrências da palavra was. Você pode usar o metacaractere \b para indicar um limite de palavras. No exemplo a seguir, a correspondência começa no primeiro caractere da string w e termina no último caractere da string s. Portanto, não corresponde às palavras com a string (como washing):

SELECT REGEXP_COUNT('It was the best of times, it was the worst of times',
                    '\\bwas\\b',
                    1) AS result;
Copy
+--------+
| RESULT |
|--------|
|      2 |
+--------+

O exemplo a seguir usa o parâmetro i para correspondência do caractere e sem distinção entre maiúsculas e minúsculas:

SELECT REGEXP_COUNT('Excelence', 'e', 1, 'i') AS e_in_excelence;
Copy
+----------------+
| E_IN_EXCELENCE |
|----------------|
|              4 |
+----------------+

O exemplo seguinte ilustra ocorrências que se sobrepõem: Criar uma tabela e inserir dados:

CREATE OR REPLACE TABLE overlap (id NUMBER, a STRING);
INSERT INTO overlap VALUES (1,',abc,def,ghi,jkl,');
INSERT INTO overlap VALUES (2,',abc,,def,,ghi,,jkl,');

SELECT * FROM overlap;
Copy
+----+----------------------+
| ID | A                    |
|----+----------------------|
|  1 | ,abc,def,ghi,jkl,    |
|  2 | ,abc,,def,,ghi,,jkl, |
+----+----------------------+

Execute uma consulta que use REGEXP_COUNT para contar o número de vezes que o seguinte padrão é encontrado em cada linha: um sinal de pontuação seguido por dígitos e letras, seguido por um sinal de pontuação.

SELECT id,
       REGEXP_COUNT(a,
                    '[[:punct:]][[:alnum:]]+[[:punct:]]',
                    1,
                    'i') AS result
  FROM overlap;
Copy
+----+--------+
| ID | RESULT |
|----+--------|
|  1 |      2 |
|  2 |      4 |
+----+--------+

Os exemplos restantes usam os dados na seguinte tabela:

CREATE OR REPLACE TABLE regexp_count_demo (dt DATE, messages VARCHAR);

INSERT INTO regexp_count_demo (dt, messages) VALUES
  ('10-AUG-2025','ER-6842,LG-230,LG-150,ER-3379,ER-6210'),
  ('11-AUG-2025','LG-272,LG-605,LG-683,ER-5577'),
  ('12-AUG-2025','ER-2207,LG-551,LG-826,ER-6842');

SELECT * FROM regexp_count_demo;
Copy
+------------+---------------------------------------+
| DT         | MESSAGES                              |
|------------+---------------------------------------|
| 2025-08-10 | ER-6842,LG-230,LG-150,ER-3379,ER-6210 |
| 2025-08-11 | LG-272,LG-605,LG-683,ER-5577          |
| 2025-08-12 | ER-2207,LG-551,LG-826,ER-6842         |
+------------+---------------------------------------+

A consulta a seguir retorna o número total de mensagens para cada dia em busca do delimitador (,) e adicionando um ao total:

SELECT dt,
       REGEXP_COUNT(messages, ',') + 1 AS message_count
  FROM regexp_count_demo;
Copy
+------------+---------------+
| DT         | MESSAGE_COUNT |
|------------+---------------|
| 2025-08-10 |             5 |
| 2025-08-11 |             4 |
| 2025-08-12 |             4 |
+------------+---------------+

Suponha que os erros sempre começam com ER seguido de um hífen e um número de quatro dígitos. A consulta a seguir conta o número de erros para cada dia:

SELECT dt,
       REGEXP_COUNT(messages, '\\bER-[0-9]{4}') AS number_of_errors
  FROM regexp_count_demo;
Copy
+------------+------------------+
| DT         | NUMBER_OF_ERRORS |
|------------+------------------|
| 2025-08-10 |                3 |
| 2025-08-11 |                1 |
| 2025-08-12 |                2 |
+------------+------------------+