测试包含特殊字符或仅包含字符/数字的列。

18 浏览
0 Comments

测试包含特殊字符或仅包含字符/数字的列。

我尝试使用通用的正则表达式属性和NOT LIKE子句来查找特殊字符,但结果令人困惑。研究表明,它不像在SQL Server或其他地方那样工作。

  1. 用于查找是否存在任何字符
  2. 用于查找是否存在任何数字
  3. 用于查找是否存在任何特殊字符

like '%[^0-9]%''%[^a-Z]%' 在查找非数字数据和非字母数据时效果不好,分别表示如下:

SELECT column1 from some_table where column1 like '%[^0-9]%'; 
SELECT column1 from some_table where column1 like '%[^a-Z]%' 
SELECT column1 from some_table where column1 like '%[^a-Z0-9]%' 

我还注意到人们使用NOT like '%[^0-9]%'

0
0 Comments

问题的原因是使用了错误的LIKE模式,这些模式不被LIKE识别。解决方法是使用~进行正则表达式匹配。以下是正确的查询语句:

select column1 from some_table where column1 ~ '[^a-Z0-9]'

或者更准确地:

select column1 from some_table where column1 ~ '[^a-zA-Z0-9]'

这将返回任何包含在字符类中未指定字符的列。

你可以在这里找到一个db<>fiddle示例。

这对我来说不起作用。我尝试使用~ '[^a-Z]' 来查找非字符值,但它只给出了不以'a'或'Z'开头的城市名。你有什么想法吗?

. . . 正则表达式匹配了任何名称中包含任何非字母的城市名称。我猜它只是恰好先返回以不同字符开头的城市名称。

它应该返回基于非字母的记录,但它只显示基于字母的干净记录。你的猜测可能是正确的,但它仍然没有显示任何基于非字母的记录。

0
0 Comments

PostgreSQL的LIKE操作符不支持正则表达式。您需要使用正则表达式操作符~。

标准SQL还定义了SIMILAR TO,它是上述操作符的奇怪混合,但最好不要使用它。您可以参考以下链接了解更多信息:Pattern matching with LIKE, SIMILAR TO or regular expressions。

要查找是否有任何字符:

... WHERE col <> ''; -- 是否有任何字符?

所以,既不是NULL也不是空。您可以参考以下链接了解更多信息:Best way to check for "empty or null value"。

要查找任何字母字符:

... WHERE col ~ '[[:alpha:]]'; -- 是否有任何字母?

[[:alpha:]]是包含所有字母字符的字符类,不仅仅是ASCII字母[A-Za-z],还包括像[ÄéÒçòý]这样的字母。

要查找任何数字:

... WHERE col ~ '\d'; -- 是否有任何数字?

\d是[[:digit:]]的类速记。

要查找除数字和字母之外的任何特殊字符:

... WHERE col ~ '\W'; -- 是否有除数字和字母之外的任何字符?

\W是[^[:alnum:]_](排除下划线)的类速记。

要查找除数字、字母和空格之外的任何字符:

... WHERE col ~ '[^[:alnum:]_ ]'; -- ...和空格

这是\W的完整写法,同时排除了普通空格。

要查找除数字、字母和任何空白字符之外的任何字符:

... WHERE col ~ '[^[:alnum:]_\s]'; -- ...和任何空白字符

... WHERE col ~ '[^[:alnum:]_[:space:]]'; -- ...和任何空白字符(完整写法)

这次还排除了由Posix字符类空白定义的所有空白字符。关于Unicode中的"空白字符",您可以参考以下链接:Trim trailing spaces with PostgreSQL。

要查找任何非ASCII字符:

如果您的数据库集群使用UTF8编码,有一个简单而快速的方法:

... WHERE octet_length(col) > length(col); -- 是否有任何非ASCII字母?

octet_length()计算字符串中的字节数,而length()(别名:character_length()或char_length())计算字符串中的字符数。所有基本ASCII字符([\x00-\x7F])在UTF-8中使用1个字节编码,所有其他字符使用2-4个字节。字符串中的任何非ASCII字符都会使表达式为true。

进一步阅读:

- PostgreSQL手册中的章节Regular Expression Class-shorthand Escapes。

- Stack Overflow上的帖子PostgreSQL 9.1 using collate in select statements。

- DBA Stack Exchange上的帖子ERROR: “sql ” is not a known variable。

十分感谢,这非常有效!... WHERE column1 ~ '\W';可以工作,但它也会显示带有空格的记录。为了解决这个问题,我使用了AND like '% %'(在'% %'之间有一个空格)。这样可以排除带有空格的记录,并给出具有特殊字符的记录的结果。

我还添加了一些代码以处理空格。

0