MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como REGEXP_INSTR() funciona no MariaDB


No MariaDB, o REGEXP_INSTR() A função retorna o índice inicial de uma substring que corresponde ao padrão de expressão regular.

O índice começa em 1 . Se não houver correspondência, o resultado será 0 .

Sintaxe


A sintaxe fica assim:
REGEXP_INSTR(subject, pattern)

Onde subject é a string de entrada e o pattern é o padrão de expressão regular para a substring.

Observe que, no momento da escrita, a versão do MariaDB de REGEXP_INSTR() aceita menos argumentos que o REGEXP_INSTR() do MySQL . A versão do MySQL permite que você forneça argumentos para a posição inicial da busca, qual ocorrência procurar, qual tipo de posição retornar, bem como uma forma de refinar a expressão regular.

Exemplo


Segue um exemplo básico:
SELECT REGEXP_INSTR('Cat', 'at');

Resultado:
+---------------------------+
| REGEXP_INSTR('Cat', 'at') |
+---------------------------+
|                         2 |
+---------------------------+

Nesse caso, há uma correspondência e a substring começa na posição 2.

Sem correspondência


Aqui está um exemplo em que não há correspondência:
SELECT REGEXP_INSTR('Cat', '^at');

Resultado:
+----------------------------+
| REGEXP_INSTR('Cat', '^at') |
+----------------------------+
|                          0 |
+----------------------------+

Não há correspondência, então o resultado é 0 . Não há correspondência porque especifiquei que a string deve começar com a substring.

Vamos alterá-lo para que faça comece com essa substring:
SELECT REGEXP_INSTR('at', '^at');

Resultado:
+---------------------------+
| REGEXP_INSTR('at', '^at') |
+---------------------------+
|                         1 |
+---------------------------+

Sensibilidade de maiúsculas e minúsculas


O REGEXP_INSTR() A função segue as regras de diferenciação de maiúsculas e minúsculas da ordenação efetiva. A correspondência é realizada sem distinção entre maiúsculas e minúsculas para ordenações que não diferenciam maiúsculas de minúsculas e com distinção entre maiúsculas e minúsculas para ordenações que diferenciam maiúsculas de minúsculas e para dados binários.

Aqui está um exemplo:
SELECT 
    REGEXP_INSTR('Cat', 'c') AS "My Default",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_ci, 'c') AS "Case Insensitive",
    REGEXP_INSTR(_latin7'Cat' COLLATE latin7_general_cs, 'c') AS "Case Sensitive";

Resultado:
+------------+------------------+----------------+
| My Default | Case Insensitive | Case Sensitive |
+------------+------------------+----------------+
|          1 |                1 |              0 |
+------------+------------------+----------------+

Meu agrupamento padrão não diferencia maiúsculas de minúsculas. As outras duas strings foram forçadas a uma ordenação sem distinção entre maiúsculas e minúsculas e ordenação com distinção entre maiúsculas e minúsculas, respectivamente.

Fornecendo um BINARY string também diferencia maiúsculas de minúsculas (veja abaixo).

Strings binárias


Por padrão, as posições são medidas em caracteres em vez de bytes. No entanto, você pode converter um conjunto de caracteres de vários bytes para BINARY para obter deslocamentos em bytes, se necessário.

Exemplo:
SELECT 
    REGEXP_INSTR('© Cat', 'C') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'C') AS "Binary";

Resultado:
+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      4 |
+-----------+--------+

O símbolo de copyright usa dois bytes e, portanto, neste exemplo, obtemos um resultado de 4 ao convertê-lo para BINARY , em comparação com 3 que obtemos de outra forma.

Embora note que passar um BINARY string também afeta a distinção entre maiúsculas e minúsculas. Com BINARY strings, um caractere maiúsculo é diferente de sua contraparte minúscula:
SELECT 
    REGEXP_INSTR('© Cat', 'c') AS "Character",
    REGEXP_INSTR(BINARY '© Cat', 'c') AS "Binary";

Resultado:
+-----------+--------+
| Character | Binary |
+-----------+--------+
|         3 |      0 |
+-----------+--------+

Aqui, procurei por uma letra minúscula c em vez de maiúsculas, e o BINARY string não correspondia.

Argumentos nulos


Passando null pois qualquer argumento resulta em null :
SELECT 
    REGEXP_INSTR(null, 'c') AS "1",
    REGEXP_INSTR('Cat', null) AS "2",
    REGEXP_INSTR(null, null) AS "3";

Resultado:
+------+------+------+
| 1    | 2    | 3    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Número errado de argumentos


Passar o número errado de argumentos ou nenhum argumento resulta em um erro:
SELECT REGEXP_INSTR('Cat');

Resultado:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'REGEXP_INSTR'