在MariaDB中返回仅包含非字母数字字符的行的2种方法

发布于

以下是在MariaDB中返回仅包含非字母数字字符的行的两种方法。

非字母数字字符包括标点符号(如和符号)以及空格字符(如空格或制表符)。!@#&()–[{}]:;',?/*```~$^+=<>“

示例数据

我们将使用以下数据作为示例:

CREATE TABLE t1 (
    c1 varchar(255) NULL
    );

INSERT INTO t1 VALUES
    ('Music'),
    ('Live Music'),
    ('Café'),
    ('Café Del Mar'),
    ('100 Cafés'),
    ('[email protected]'),
    ('1 + 1'),
    ('()'),
    ('!@#&()–[{}]:;'',?/*'),
    ('`~$^+=<>“'),
    ('$1.50'),
    ('Player 456'),
    ('007'),
    (null),
    (''),
    ('é'),
    ('É'),
    ('é 123'),
    ('ø'),
    ('ø 123');
SELECT c1 FROM t1;

结果:

+———————-+ | c1 | +———————-+ | Music | | Live Music | | Café | | Café Del Mar | | 100 Cafés | | [email protected] | | 1 + 1 | | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | | $1.50 | | Player 456 | | 007 | | NULL | | | | é | | É | | é 123 | | ø | | ø 123 | +———————-+

选项 1:比较[:alnum:]

MariaDB 的正则表达式功能包括对 POSIX 字符类的支持。因此,我们可以在正则表达式中使用 POSIX 字符类来查找仅包含字母数字字符的行,然后用运算符将其取反。[:alnum:]``NOT

SELECT c1 FROM t1 
WHERE c1 NOT REGEXP '[[:alnum:]]';

结果:

+———————-+ | c1 | +———————-+ | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | | | +———————-+

如果需要排除特定字符,则始终可以使用该函数。NULLIF()

例如,让我们从最后一行中排除空字符串:

SELECT c1 FROM t1 
WHERE NULLIF(c1, '') NOT REGEXP '[[:alnum:]]';

结果:

+———————-+ | c1 | +———————-+ | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | +———————-+

选项 2:指定字符范围

另一种方法是在正则表达式中指定字符范围。

例:

SELECT c1 FROM t1 
WHERE c1 NOT REGEXP '[A-Za-z0-9]';

结果:

+———————-+ | c1 | +———————-+ | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | | | | é | | É | | ø | +———————-+

并删除空字符串:

SELECT c1 FROM t1
WHERE NULLIF(c1, '') NOT REGEXP '[A-Za-z0-9]';

结果:

+———————-+ | c1 | +———————-+ | () | | !@#&()–[{}]:;’,?/* | | `~$^+=<>“ | | é | | É | | ø | +———————-+

在这个示例中,我的排除范围不包括字母数字字符,例如,,因此输出不是非字母数字字符的真实表示形式。也就是说,至少此方法为您提供了指定要在结果中包含或排除的确切字符的选项。é``É``ø