在MariaDB中查找包含大写字母的行的4种方法

发布于

以下是返回 MariaDB 中包含大写字符的行的四个选项。

示例数据

假设我们有一个包含以下数据的表:

SELECT c1 FROM t1;

结果:

+—————-+ | c1 | +—————-+ | CAFÉ | | Café | | café | | 1café | | eCafé | | James Bond 007 | | JB 007 | | 007 | | NULL | | | | É | | É 123 | | é | | é 123 | | ø | | Ø | +—————-+

我们可以使用以下方法来返回包含大写字母的行。

选项 1:与 POSIX 字符类进行比较

我们可以使用运算符来执行正则表达式模式的匹配。REGEXP

一个简单的选项是将我们的列与 POSIX 字符类进行比较:[:upper:]

SELECT c1 FROM t1
WHERE c1 REGEXP '[[:upper:]]';

结果:

+—————-+ | c1 | +—————-+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +—————-+

RLIKE是 的同义词,因此我们可以替换以获得相同的结果:REGEXP``REGEXP``RLIKE

SELECT c1 FROM t1
WHERE c1 RLIKE '[[:upper:]]';

选项 2:与字符串比较LOWER()

另一种选择是使用 thefunction 将原始值与其小写等效值进行比较:LOWER()

SELECT c1 FROM t1
WHERE BINARY LOWER(c1) <> BINARY c1;

结果:

+—————-+ | c1 | +—————-+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | | É | | É 123 | | Ø | +—————-+

通过使用不等于 (<>) 运算符(您也可以使用代替,如果您愿意),我们只返回那些与其小写等效项不同的行。我们这样做的原因是,如果一个值与其小写等价值相同,那么它一开始就已经是小写了(我们不想返回它)。!=<>

默认情况下,MariaDB 执行不区分大小写的搜索,因此我使用运算符来获取区分大小写的搜索。BINARY

这也可以像这样完成:

SELECT c1 FROM t1
WHERE BINARY(LOWER(c1)) <> BINARY(c1);

选项 3:与实际字符进行比较

另一种选择是使用带有正则表达式模式的运算符,该模式明确包含我们要匹配的每个大写字符:REGEXP

SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]';

结果:

+—————-+ | c1 | +—————-+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +—————-+

这次返回的行比前面的示例少。那是因为我没有指定在上一个示例中返回的 characterlikeand。我们的结果确实包含但仅返回该行,因为它还_包含匹配的其他_大写字符。É``Ø``É

因此,如果使用此选项,则需要确保已覆盖所有有效字符。

选项 4:与一系列字符进行比较

另一种方法是指定我们要匹配的字符范围:

SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[A-Z]';

结果:

+—————-+ | c1 | +—————-+ | CAFÉ | | Café | | eCafé | | James Bond 007 | | JB 007 | +—————-+