Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

3 maneiras de encontrar linhas que contêm letras maiúsculas no MySQL


Aqui estão três opções para retornar linhas que contêm caracteres maiúsculos no MySQL.

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:Compare com o LOWER() Cadeia


Podemos usar o LOWER() função para comparar o valor original com seu equivalente em minúsculas:
SELECT c1 FROM t1
WHERE CAST(LOWER(c1) AS BINARY) <> CAST(c1 AS BINARY);

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 MySQL realiza uma pesquisa que não diferencia maiúsculas de minúsculas e, portanto, uso o CAST() função para converter os valores em binário para obter uma pesquisa com distinção entre maiúsculas e minúsculas.

Também é possível usar o BINARY para converter o valor em binário, mas este operador está obsoleto a partir do MySQL 8.0.27 e pode ser removido em uma versão futura.

De qualquer forma, é assim que o código se parece ao usar o BINARY operador:
SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;

Também pode ser feito assim:
SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);

Aqui estão os resultados que recebo de ambos ao executar o código no MySQL 8.0.27:
+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
| É              |
| É 123          |
| Ø              |
+----------------+
8 rows in set, 2 warnings (0.00 sec)

E quando eu mostro os avisos:
SHOW WARNINGS;

Resultado:
+---------+------+----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                      |
+---------+------+----------------------------------------------------------------------------------------------+
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
| Warning | 1287 | 'BINARY expr' is deprecated and will be removed in a future release. Please use CAST instead |
+---------+------+----------------------------------------------------------------------------------------------+

Opção 2: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 CAST(c1 AS BINARY) REGEXP CAST('[ABCDEFGHIJKLMNOPQRSTUVWXYZ]' AS BINARY);

Resultado:
+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+

Desta vez, menos linhas são retornadas do que nos exemplos anteriores. Isso 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, você precisará garantir que todos os caracteres válidos sejam cobertos se usar essa opção.

Opção 3:comparar com um intervalo de caracteres


Outra maneira de fazer isso é especificar o intervalo de caracteres maiúsculos que queremos corresponder:
SELECT c1 FROM t1
WHERE CAST(c1 AS BINARY) REGEXP CAST('[A-Z]' AS BINARY);

Resultado:
+----------------+
| c1             |
+----------------+
| CAFÉ           |
| Café           |
| eCafé          |
| James Bond 007 |
| JB 007         |
+----------------+