A maioria dos principais SGBDs nos fornece uma maneira de encontrar uma string dentro de uma string usando SQL. Com isso, quero dizer usar uma consulta SQL para encontrar a posição de uma substring dentro de uma string.
Existem várias funções SQL que nos permitem fazer isso, incluindo
INSTR()
, LOCATE()
, POSITION()
e CHARINDEX()
. A função que você usa dependerá do seu DBMS e, possivelmente, se você precisa ou não especificar uma posição inicial. Oráculo
Oracle tem um
INSTR()
função que retorna a posição inicial de uma determinada substring dentro de uma string. Exemplo:
SELECT INSTR('Big fat cat', 'fat')
FROM DUAL;
Resultado:
5
Isso nos mostra que a substring
fat
começa na posição 5 na string Big fat cat
. É possível especificar uma posição inicial passando um terceiro argumento. Também podemos passar um quarto argumento para especificar qual ocorrência encontrar:
SELECT INSTR('That fat cat', 'at', 1, 2)
FROM DUAL;
Resultado:
7
Neste caso eu iniciei a busca na posição
1
e procurou a segunda ocorrência (usando 2
como o quarto argumento). Oracle também tem um
INSTRB()
função que faz algo semelhante, exceto que retorna a posição baseada em bytes. MySQL
MySQL tem um
INSTR()
função que faz algo semelhante à função do banco de dados Oracle de mesmo nome:SELECT INSTR('Cats and dogs like to run', 'dogs');
Resultado:
10
No entanto, se você precisar especificar uma posição inicial, precisará usar
LOCATE()
ou POSITION()
:SELECT LOCATE('cat', 'One cat jumped over the other cat', 6);
Resultado:
31
Aqui, a primeira ocorrência de
cat
começa na posição 5, mas especifiquei a busca para iniciar na posição 6. Portanto, a posição da próxima ocorrência dessa string foi a que foi retornada. Observe que, embora a pesquisa tenha começado na posição 6, a função ainda retorna a posição da substring dentro da string – não a partir da posição inicial.
A
POSITION()
função é um sinônimo para a sintaxe de dois argumentos de LOCATE()
, mas com uma sintaxe ligeiramente diferente (POSITION()
não nos permite especificar uma posição inicial). MySQL também tem um
REGEX_INSTR()
função que retorna o índice inicial da substring da string que corresponde à expressão regular especificada pelo padrão especificado. MariaDB
Assim como o MySQL, o MariaDB também possui um
INSTR()
função, bem como um um LOCATE()
e POSITION()
função:SELECT
INSTR('No news is good news', 'news') AS "INSTR",
POSITION('news' IN 'No news is good news') AS "POSITION",
LOCATE('news', 'No news is good news') AS "LOCATE 1",
LOCATE('news', 'No news is good news', 5) AS "LOCATE 2";
Resultado:
+-------+----------+----------+----------+ | INSTR | POSITION | LOCATE 1 | LOCATE 2 | +-------+----------+----------+----------+ | 4 | 4 | 4 | 17 | +-------+----------+----------+----------+
MariaDB também tem um
REGEX_INSTR()
função que retorna o índice inicial da substring da string que corresponde à expressão regular especificada pelo padrão especificado. SQL Server
Quando se trata de SQL Server, o
CHARINDEX()
função é o que estamos procurando:SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);
Resultado:
17
Nesse caso, usei o terceiro argumento opcional para especificar uma posição inicial.
SQL Server também tem um
PATINDEX()
função que procura um padrão dentro de uma string. SQLite
SQLite tem um
INSTR()
função para satisfazer as nossas necessidades:SELECT INSTR('Black cat', 'lack');
Resultado:
2
PostgreSQL
No PostgreSQL, precisamos usar o
POSITION()
função:SELECT POSITION('Break' IN 'Bangkok Breaking');
Resultado:
9