我有一个数据库表我希望返回列中包含非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]
谢谢!
答案 0 :(得分:0)
您可以通过查看此表格来选择您要使用的范围:http://unicode-table.com/en/。
查看下面的代码,我根据特定的字符范围进行过滤。
dev=# create table tb1 ( id integer, col1 varchar(10) , col2 varchar(10) ) distkey(id);
CREATE TABLE
dev=# insert into tb1 values (1, 'ABC', 'DEF');
INSERT 0 1
dev=# insert into tb1 select 1, chr(638), chr(640);
INSERT 0 1
dev=# insert into tb1 select 4, concat(concat('AB', chr(638)),'CD') , chr(640);
INSERT 0 1
dev=# select * from tb1;
id | col1 | col2
----+-------+------
4 | ABɾCD | ʀ
1 | ABC | DEF
1 | ɾ | ʀ
(3 rows)
dev=# select id, col1, regexp_instr(col1,'[^\x00-\x7F]') , col2, regexp_instr(col2,'[^\x00-\x7F]') from tb1;
id | col1 | regexp_instr | col2 | regexp_instr
----+-------+--------------+------+--------------
4 | ABɾCD | 3 | ʀ | 1
1 | ABC | 0 | DEF | 0
1 | ɾ | 1 | ʀ | 1
(3 rows)
答案 1 :(得分:0)
我最近试图完成类似的任务,但是上述解决方案(在regex表达式中编写'[^\x00-\x7F]'
)无效。
通常,反斜杠与文字字符的组合可以创建具有特殊含义的正则表达式令牌,在这种情况下,\x
表示“十六进制值为的字符”,其中00
和7F
是十六进制值。
尽管Postgres支持(see 9.7.3.3. Regular Expression Escapes),但Redshift的正则表达式引擎似乎不支持。您可以检查Redshift到底支持here。
为此找到的最短,最简洁的解决方法是:
SELECT column_name,
CASE
WHEN regexp_instr(column_name, '[^[:print:][:cntrl:]]') > 0 THEN TRUE
ELSE FALSE END AS has_non_ascii_char
FROM table_name
WHERE has_non_ascii_char;