测试列中是否包含特殊字符或仅包含字符/数字

时间:2019-05-07 20:24:09

标签: sql regex postgresql data-cleaning

我尝试使用通用正则表达式属性和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]%'

2 个答案:

答案 0 :(得分:1)

Postgres LIKE不支持正则表达式。
您需要regular expression operator ~

标准SQL还将SIMILAR TO定义为上述内容的一种奇怪组合,但不要使用它。参见:

  

用于查找是否有任何字符

...表示任何字符

... WHERE col <> '';                        -- any character at all?

所以既不为NULL也不为空。参见:

...表示任何字母字符(字母):

... WHERE col ~ '[[:alpha:]]';              -- any letters?

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

  

查找是否有数字

...表示任何位数

... WHERE col ~ '\d';                       -- any digits?

\d[[:digit:]]的类简写。

  

用于查找是否有特殊字符

...表示除数字和字母之外的任何内容:

... WHERE col ~ '\W';                       -- anything but digits & letters? 

\W[^[:alnum:]_]的类简写(下划线排除了-该手册目前在这里令人困惑)。

...表示除数字,字母和空格之外的任何内容:

... WHERE col ~ '[^[:alnum:]_ ]'            -- ... and space

这是班级速记\W的拼写,另外不包括空白。

...表示除数字,字母和任何空格外的任何内容:

... WHERE col ~ '[^[:alnum:]_\s]'           -- ... and any white space
... WHERE col ~ '[^[:alnum:]_[:space:]]'    -- ... the same spelled out

这次不包括Posix字符类 space 定义的所有空白。关于Unicode中的“空白”:

...表示任何非ASCII字符:

如果您的数据库集群使用UTF8编码运行,则有一个简单,非常快速的破解方法:

... WHERE octet_length(col) > length(col);  -- any non-ASCII letter?

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

进一步阅读:

答案 1 :(得分:0)

问题是您使用的LIKE错误。 LIKE无法识别这些模式。

使用~进行正则表达式匹配:

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

或更贴切:

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

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

Here是db <>小提琴。