在MonetDB表列中寻找特殊字符

问题描述 投票:0回答:1

我是MonetDB的新手,我想检查一下MonetDB的任何列中是否有任何特殊字符。例如,我有一个测试数据库,表名是Lmr。我将检查表lmr中的任何列是否包含特殊字符?

我尝试过的查询:

SELECT jk
FROM lmr
WHERE jk like '%[^a-Z0-9]%'

我有多列,所以有什么办法可以一次检查带有特殊字符的所有列?

monetdb
1个回答
0
投票

LIKEILIKE运算符在内部使用PCRE,但没有表现出相同的表达能力。基本上,您只能将%用作通配符。

幸运的是,MonetDB已经为PCRE库提供了包装器。它们仅需要在SQL层上可用。

为了做到这一点,您只需要创建链接到已经可用的代码的SQL函数签名:

CREATE OR REPLACE FUNCTION pcre_match(s string, pattern string) RETURNS boolean EXTERNAL NAME pcre."match";
CREATE OR REPLACE FUNCTION pcre_imatch(s string, pattern string) RETURNS boolean EXTERNAL NAME pcre."imatch";
CREATE OR REPLACE FUNCTION pcre_replace(s string, pattern string, repl string, flags string) RETURNS string EXTERNAL NAME pcre."replace";
CREATE OR REPLACE FUNCTION pcre_replacefirst(s string, pattern string, repl string, flags string) RETURNS string EXTERNAL NAME pcre."replace_first";

此后(在数据库中只能执行一次),您可以执行:

SELECT jk
FROM lmr
WHERE pcre_imatch(jk,'[^a-z0-9]');

第二个参数是常规PCRE模式。请注意,您的示例中有一个错误。范围a-Z不存在,因为aZ之后。

在我的示例中,我使用了函数的[[i(忽略大小写)变体,并且仅使用了范围a-z

如果您愿意,也可以使用Unicode categories并重写示例以将所有非字母或数字匹配为:

SELECT jk FROM lmr WHERE pcre_imatch(jk,'[^\\p{L}\\p{N}');

请记住,您需要转义每个\,然后变成\\
© www.soinside.com 2019 - 2024. All rights reserved.