sql >> Base de Datos >  >> RDS >> Mysql

Seleccione TODOS los campos que contengan solo letras MAYÚSCULAS

Es posible que desee utilizar una collation que distingue entre mayúsculas y minúsculas. . Creo que el valor predeterminado no distingue entre mayúsculas y minúsculas. Ejemplo:

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');

Entonces:

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

Si no desea utilizar una intercalación que distinga entre mayúsculas y minúsculas para toda la tabla, también puede utilizar COLLATE cláusula como @kchau sugirió en la otra respuesta .

Probemos con una tabla usando una intercalación que no distingue entre mayúsculas y 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');

Esto no funcionará muy bien:

SELECT * FROM my_table WHERE name REGEXP '^[A-Z]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    1 | SomeThing |
|    2 | something |
|    3 | SOMETHING |
+------+-----------+
3 rows in set (0.00 sec)

Pero podemos usar COLLATE cláusula para cotejar el campo de nombre en una colación sensible a mayúsculas y 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)