我有一个数据库表,我想返回所有的值,其中一列包含一个非ASCII字符的字符串中的任何地方。
有简单的方法吗?
我试过了
select col_name, regexp_instr(col_name,'[^[:ascii:]]')
from test_table s
where created > sysdate - 1
and regexp_instr(col_name,'[^[:ascii:]]') > 0
limit 5;
但得到以下错误:
error: Invalid character class name, collating name, or character range. The error occured while parsing the regular expression: '[^[:>>>HERE>>>ascii:]]'.
code: 8002
context: T_regexp_init
query: 5059536
location: funcs_expr.cpp:130
process: query20_31 [pid=7903]
谢谢你!
3条答案
按热度按时间798qvoo81#
我最近试图完成类似的事情,但是@BigDataKid的解决方案(在正则表达式中写入
'[^\x00-\x7F]'
)不起作用。通常,反斜杠与文字字符组合可以创建具有特殊含义的正则表达式标记,在本例中,
\x
表示“十六进制值为的字符”,其中00
和7F
是十六进制值。虽然Postgres支持它(see 9.7.3.3. Regular Expression Escapes),但Redshift的正则表达式引擎似乎不支持。
我找到的最简单明了的解决方法是:
正则表达式解释:
外部括号
[
、]
(或者列表,如果您愿意)称为“括号表达式”,脱字符(^
)表示否定,因此[^]
翻译为“匹配列表中没有的任何字符”。在列表中,我们有
[:print:]
和[:cntrl:]
,它们被称为“POSIX字符类”。[:print:]
是指任何可打印的ASCII字符(包括空格),[:cntrl:]
是指所有ASCII控制字符(例如制表符),它们合起来应该涵盖所有ASCII字符。lokaqttq2#
您可以通过查看下表来选择要使用的范围或字符:http://unicode-table.com/en/。
请看下面的代码,其中我根据特定的字符范围进行过滤。
vhipe2zx3#
也许它会对某人和https://www.asciitable.com/有用