【问题标题】:Select ALL fields that contains only UPPERCASE letters选择仅包含大写字母的所有字段
【发布时间】:2010-10-01 05:48:05
【问题描述】:

mysql中如何选择只包含大写字符的字段或不包含任何小写字符的字段?

【问题讨论】:

  • 字段是否允许包含非字母?

标签: mysql


【解决方案1】:

您可能希望使用区分大小写的collation。我相信默认值不区分大小写。示例:

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]+$';
+------+-----------+
| id   | name      |
+------+-----------+
|    3 | SOMETHING |
+------+-----------+
1 row in set (0.00 sec)

如果您不想对整个表使用区分大小写的排序规则,也可以将COLLATE 子句用作@kchau suggested in the other answer。

让我们尝试使用不区分大小写的排序规则的表格:

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)

【讨论】:

  • 另一种方法是使用 BINARY compare BINARY city_name = BINARY upper(city_name)
  • @AivanMonceller BINARY 实际上是更好的答案:)
【解决方案2】:

这对我有用。它找到了所有带有大写字符的用户电子邮件:

SELECT * FROM users WHERE mail REGEXP BINARY '[A-Z]';

【讨论】:

【解决方案3】:
SELECT * FROM table1 WHERE (columnname COLLATE latin1_bin )=UPPER(depart);

【讨论】:

  • 这也将选择包含数字和其他字符的字段。我不认为 OP 想要那样。
【解决方案4】:

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

使用[:upper:] 表示大写字母。

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

【讨论】:

  • 使用 [:upper:] 也会选择“示例”.. [^a-z] 似乎无法正常工作
【解决方案5】:
SELECT column_name FROM table WHERE column_name REGEXP BINARY '^[A-Z]+$'

【讨论】:

  • 这是这里发布的最简单、最清晰、最简洁的答案。
【解决方案6】:

基本eg。

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

【讨论】:

  • 不工作,谢谢 SELECT 'as' REGEXP '[A-Z]' 返回 1 SELECT 'AS' REGEXP '[A-Z]' 返回 1
  • 您的字段是否可以包含其他字符,例如空格等?如果是这样,您也希望将它们包含在正则表达式模式中。
【解决方案7】:

试试这个 -

SELECT * FROM <mytable> WHERE UPPER(<columnname>) = <columnname>

【讨论】:

  • 这不适用于不区分大小写的排序规则。此外,这还将选择包含数字和其他字符的字段。我不认为 OP 想要那样。
  • @Daniel - 是的,我同意这不处理特殊字符。但是这个问题并不清楚他想要或不想保留特殊字符。
【解决方案8】:

在 cmets 中找到了这个 - 它应该有自己的帖子:

SELECT * FROM mytable WHERE BINARY mycolumn = BINARY UPPER(mycolumn);

WHERE UPPER(mycolumn) = mycolumn 的问题在于排序规则,这取决于您的表可以在那里使用什么。

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2014-07-04
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2014-09-11
    相关资源
    最近更新 更多