在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 | +—————-+