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

Selecione TODOS os campos que contêm apenas letras MAIÚSCULAS


Você pode querer usar um collation que diferencia maiúsculas de minúsculas . Eu acredito que o padrão não diferencia maiúsculas de minúsculas. Exemplo:
CREATE TABLE my_table (
   id int,
   name varchar(50)
) CHARACTER SET latin1 COLLATE latin1_general_cs;

INSERT INTO my_table VALUES (1, 'SomeThing');
INSERT INTO my_table VALUES (2, 'something');
INSERT INTO my_table VALUES (3, 'SOMETHING');
INSERT INTO my_table VALUES (4, 'SOME4THING');

Então:
SELECT * FROM my_table WHERE name REGEXP '^[A-Z]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    3 | SOMETHING |
+------+-----------+
1 row in set (0.00 sec)

Se você não quiser usar um agrupamento sensível a maiúsculas e minúsculas para toda a tabela, você também pode usar o COLLATE cláusula como @kchau sugerido na outra resposta .

Vamos tentar com uma tabela usando um agrupamento que não diferencia maiúsculas de minúsculas:
CREATE TABLE my_table (
   id int,
   name varchar(50)
) CHARACTER SET latin1 COLLATE latin1_general_ci;

INSERT INTO my_table VALUES (1, 'SomeThing');
INSERT INTO my_table VALUES (2, 'something');
INSERT INTO my_table VALUES (3, 'SOMETHING');
INSERT INTO my_table VALUES (4, 'SOME4THING');

Isso não vai funcionar muito bem:
SELECT * FROM my_table WHERE name REGEXP '^[A-Z]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | SomeThing |
|    2 | something |
|    3 | SOMETHING |
+------+-----------+
3 rows in set (0.00 sec)

Mas podemos usar o COLLATE cláusula para agrupar o campo de nome em um agrupamento que diferencia maiúsculas de minúsculas:
SELECT * FROM my_table WHERE (name COLLATE latin1_general_cs) REGEXP '^[A-Z]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    3 | SOMETHING |
+------+-----------+
1 row in set (0.00 sec)