Mysql
 sql >> Database >  >> RDS >> Mysql

Seleziona TUTTI i campi che contengono solo lettere MAIUSCOLE

Potresti voler utilizzare una collation con distinzione tra maiuscole e minuscole . Credo che l'impostazione predefinita non faccia distinzione tra maiuscole e minuscole. Esempio:

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

Quindi:

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

Se non desideri utilizzare regole di confronto con distinzione tra maiuscole e minuscole per l'intera tabella, puoi anche utilizzare COLLATE clausola come @kchau suggerito nell'altra risposta .

Proviamo con una tabella che utilizza regole di confronto senza distinzione tra maiuscole e minuscole:

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

Questo non funzionerà molto bene:

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

Ma possiamo usare il COLLATE clausola per confrontare il campo del nome in una confronto con distinzione tra maiuscole e minuscole:

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