Aqui estão quatro opções para retornar linhas que contêm letras maiúsculas no PostgreSQL.
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
~
operador para executar uma correspondência com distinção entre maiúsculas e minúsculas de um padrão de expressão regular. O padrão pode ser tão simples ou complexo quanto quisermos. Uma opção simples é comparar nossa coluna com o
[:upper:]
Classe de caracteres POSIX:SELECT c1 FROM t1
WHERE c1 ~ '[[:upper:]]';
Resultado:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007 É É 123 Ø
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 LOWER(c1) <> 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 PostgreSQL realiza uma correspondência que diferencia maiúsculas de minúsculas e, portanto, não precisamos especificar um agrupamento que diferencia maiúsculas de minúsculas para obter o resultado que desejamos.
Opção 3:comparar com os caracteres reais
Outra opção é usar o
~
operador com um padrão de expressão regular que inclui explicitamente cada caractere maiúsculo que queremos corresponder:SELECT c1 FROM t1
WHERE c1 ~ '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';
Resultado:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007
Nesse caso, menos linhas são retornadas do que nos exemplos anteriores. Isso ocorre porque não especifiquei caracteres como
É
e Ø
, que foram retornados nesses exemplos. Nosso resultado contém É
mas essa linha só foi retornada porque também contém outros caracteres maiúsculos que fazem partida. Portanto, essa opção é mais limitada que a anterior, mas fornece mais controle sobre os caracteres que você deseja corresponder.
Opção 4:comparar com um intervalo de caracteres
Alternativamente, podemos especificar o intervalo de caracteres que queremos corresponder:
SELECT c1 FROM t1
WHERE c1 ~ '[A-Z]';
Resultado:
c1 ---------------- CAFÉ Café eCafé James Bond 007 JB 007