Aqui estão quatro opções para retornar linhas que contêm caracteres maiúsculos no MariaDB.
Dados de amostra
Suponha que temos uma tabela com os seguintes dados:
SELECT c1 FROM t1;
Resultado:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +----------------+
Podemos usar os seguintes métodos para retornar as linhas que contêm letras maiúsculas.
Opção 1:comparar com uma classe de caracteres POSIX
Podemos usar o
REGEXP
operador para executar uma correspondência de um padrão de expressão regular. Uma opção simples é comparar nossa coluna com o
[:upper:]
Classe de caracteres POSIX:SELECT c1 FROM t1
WHERE c1 REGEXP '[[:upper:]]';
Resultado:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
RLIKE
é um sinônimo para REGEXP
, para que possamos substituir REGEXP
com RLIKE
para obter o mesmo resultado:SELECT c1 FROM t1
WHERE c1 RLIKE '[[:upper:]]';
Opção 2:Compare com o LOWER()
Cadeia
Outra opção é usar o
LOWER()
função para comparar o valor original com seu equivalente em minúsculas:SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;
Resultado:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +----------------+
Usando o diferente de (
<>
) (você pode usar alternativamente !=
em vez de <>
se preferir), apenas retornamos as linhas que são diferentes de seus equivalentes em minúsculas. A razão pela qual fazemos isso é porque, se um valor é o mesmo que seu equivalente em minúsculas, então já estava em minúsculas (e não queremos devolvê-lo). Por padrão, o MariaDB realiza uma pesquisa que não diferencia maiúsculas de minúsculas e, portanto, uso o
BINARY
operador para obter uma pesquisa com distinção entre maiúsculas e minúsculas. Isso também pode ser feito assim:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);
Opção 3:comparar com os caracteres reais
Outra opção é usar o
REGEXP
operador com um padrão de expressão regular que inclui explicitamente cada caractere maiúsculo que queremos corresponder:SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';
Resultado:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+
Desta vez, menos linhas são retornadas do que nos exemplos anteriores. Isso porque eu não especifiquei caracteres como
É
e Ø
, que foram retornados no exemplo anterior. Nosso resultado contém É
mas essa linha só foi retornada porque também contém outros caracteres maiúsculos que fazem partida. Portanto, você precisará garantir que todos os caracteres válidos sejam cobertos se usar essa opção.
Opção 4:comparar com um intervalo de caracteres
Outra maneira de fazer isso é especificar o intervalo de caracteres que queremos corresponder:
SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[A-Z]';
Resultado:
+----------------+ | c1 | +----------------+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +----------------+