如何在Redshift数据库中找到任何非ASCII字符

时间:2016-09-07 16:50:49

标签: ascii amazon-redshift

我有一个数据库表我希望返回列中包含非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]

谢谢!

2 个答案:

答案 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表示“十六进制值为的字符”,其中007F是十六进制值。
尽管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;