在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 字符类进行比较:[:lower:]

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

结果:

+—————-+ | c1 | +—————-+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +—————-+

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

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

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

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

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

结果:

+—————-+ | c1 | +—————-+ | Café | | café | | 1café | | eCafé | | James Bond 007 | | é | | é 123 | | ø | +—————-+

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

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

这也可以像这样完成:

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

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

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

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

结果:

+—————-+ | c1 | +—————-+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +—————-+

这次返回的行比前面的示例少。那是因为我没有指定字符 likeand,这些字符在这些示例中返回。我们的结果确实包含但返回该行只是因为它还包含其他_匹配_的小写字符。é``ø``é

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

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

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

SELECT c1 FROM t1
WHERE BINARY c1 REGEXP BINARY '[a-z]';

结果:

+—————-+ | c1 | +—————-+ | Café | | café | | 1café | | eCafé | | James Bond 007 | +—————-+