我是MonetDB的新手,我想检查一下MonetDB的任何列中是否有任何特殊字符。例如,我有一个测试数据库,表名是Lmr。我将检查表lmr中的任何列是否包含特殊字符?
我尝试过的查询:
SELECT jk
FROM lmr
WHERE jk like '%[^a-Z0-9]%'
我有多列,所以有什么办法可以一次检查带有特殊字符的所有列?
LIKE
和ILIKE
运算符在内部使用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
不存在,因为a
在Z
之后。
在我的示例中,我使用了函数的[[i
(忽略大小写)变体,并且仅使用了范围a-z
。
SELECT jk
FROM lmr
WHERE pcre_imatch(jk,'[^\\p{L}\\p{N}');
请记住,您需要转义每个\
,然后变成\\
。