我尝试使用通用正则表达式属性和NOT LIKE
子句查找特殊字符,但结果一直令人困惑。研究表明,它不能像在SQL Server或其他地方那样工作。
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 :(得分: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()
)对个字符进行计数字符串中的em>。所有基本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 <>小提琴。