Выберите ВСЕ поля, которые содержат только буквы в верхнем регистре

Как выбрать поле, содержащее только заглавные буквы в mysql, или поле, которое не содержит строчных букв?

 martin clayton01 окт. 2010 г., 08:01
Разрешено ли в полях содержать не буквы?

Ответы на вопрос(7)

Решение Вопроса

Вы можете использовать регистр символовсличение, Я считаю, что по умолчанию регистр не учитывается. Пример:

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

Затем:

SELECT * FROM my_table WHERE name REGEXP '^[A-Z]+

Если вы не хотите использовать сортировку с учетом регистра для всей таблицы, вы также можете использоватьCOLLATE пункт как@kchau предложил в другом ответе.

Давайте попробуем с таблицей использовать сортировку без учета регистра:

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

Это не будет работать очень хорошо:

SELECT * FROM my_table WHERE name REGEXP '^[A-Z]+

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Если вы не хотите использовать сортировку с учетом регистра для всей таблицы, вы также можете использоватьCOLLATE пункт как@kchau предложил в другом ответе.

Давайте попробуем с таблицей использовать сортировку без учета регистра:

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

Это не будет работать очень хорошо:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Если вы не хотите использовать сортировку с учетом регистра для всей таблицы, вы также можете использоватьCOLLATE пункт как@kchau предложил в другом ответе.

Давайте попробуем с таблицей использовать сортировку без учета регистра:

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

Это не будет работать очень хорошо:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Если вы не хотите использовать сортировку с учетом регистра для всей таблицы, вы также можете использоватьCOLLATE пункт как@kchau предложил в другом ответе.

Давайте попробуем с таблицей использовать сортировку без учета регистра:

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

Это не будет работать очень хорошо:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

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

Если вы не хотите использовать сортировку с учетом регистра для всей таблицы, вы также можете использоватьCOLLATE пункт как@kchau предложил в другом ответе.

Давайте попробуем с таблицей использовать сортировку без учета регистра:

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

Это не будет работать очень хорошо:

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

Но мы можем использоватьCOLLATE условие для сопоставления поля имени с учетом регистра:

SELECT * FROM my_table WHERE (name COLLATE latin1_general_cs) REGEXP '^[A-Z]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    3 | SOMETHING |
+------+-----------+
1 row in set (0.00 sec)
 Aivan Monceller04 окт. 2010 г., 05:04
Другой способ - использовать двоичное сравнение. BINARY city_name = BINARY upper (city_name)
 northtree06 нояб. 2015 г., 10:28
@AivanMonceller BINARY - лучший ответ на самом деле :)

REGEXP : http://www.tech-recipes.com/rx/484/use-regular-expressions-in-mysql-select-statements/

использование[:upper:] для заглавных букв.

SELECT * FROM table WHERE field REGEXP '^[[:upper:]+]$'

 Aivan Monceller01 окт. 2010 г., 07:58
использование [: upper:] также выберет «Пример». [^ a-z], кажется, не работает нормально
 Ruel01 окт. 2010 г., 08:06
изм. Попробуй это. :)

например.

SELECT * FROM foo WHERE bar REGEXP '[A-Z]';

 kafuchau01 окт. 2010 г., 07:57
Может ли ваше поле содержать другие символы, такие как пробелы и т. Д.? Если это так, вы бы хотели включить их в шаблон регулярного выражения.
 Aivan Monceller01 окт. 2010 г., 07:55
не работает благодаря SELECT, поскольку 'REGEXP' [A-Z] 'возвращает 1 SELECT' AS 'REGEXP' [A-Z] 'возвращает 1
SELECT column_name FROM table WHERE column_name REGEXP BINARY '^[A-Z]+
 JakeGould23 мая 2019 г., 18:18
Это самый простой, ясный и краткий ответ, размещенный здесь.
select * from table1 where (columnname COLLATE latin1_bin )=upper(depart);
 Daniel Vassallo01 окт. 2010 г., 08:11
Это также будет выбирать поля, которые содержат цифры и другие символы. Я не думаю, что ОП хочет этого.

Попробуй это -

select * from <mytable> where upper(<columnname>) = <columnname>
 Sachin Shanbhag01 окт. 2010 г., 08:15
@ Даниэль - Да, я согласен, что это не обрабатывает специальные символы. Но не ясно, хочет ли он или не хочет сохранять специальные символы.
 Sachin Shanbhag01 окт. 2010 г., 08:00
@ В здравом уме - Спасибо. Да ты прав. Отредактировал мой ответ.
 Daniel Vassallo01 окт. 2010 г., 08:12
Это не будет работать с сортировкой без учета регистра. Кроме того, это также будет выбирать поля, которые содержат цифры и другие символы. Я не думаю, что ОП хочет этого.

с заглавными буквами:

SELECT * FROM users WHERE mail REGEXP BINARY '[A-Z]';
 geg07 авг. 2017 г., 17:13
«REGEXP не чувствителен к регистру, за исключением случаев, когда используется с двоичными строками». -dev.mysql.com/doc/refman/5.7/en/regexp.html

Ваш ответ на вопрос