我在Oracle中有一个表,其中包含一个名为DESCRIPTION的VARCHAR列。某些行包含不可打印的字符,例如数字值为150的字符(不是在Latin-1中,而是Unicode中的“受保护区域起点”)。
我想选择其描述列包含数字值介于128和160之间的字符的所有行。有没有办法在没有长列的LIKE子句的情况下进行OR?我想可以用正则表达式来完成,但我还没有办法做到这一点。
答案 0 :(得分:5)
我最近必须做一些非常类似的事情并使用这样的SQL:
with codes as (select rownum code from dual connect by level <= 160)
select distinct t.id, t.description
from mytable t, codes c
where t.description like '%' || chr(c.code) || '%'
and c.code >= 128;
答案 1 :(得分:1)
文森特的帖子帮我解决了这个问题!我想找到所有具有任何扩展ASCII的行:128-255,所以我将语句简化为:
SELECT description
FROM your_table
WHERE regexp_like (description, '['||chr(128)||'-'||chr(255)||']');
获取范围的简短方法。
答案 2 :(得分:0)
你可以使用正则表达式,它可能比30+单个WHERE子句表现更好,但它不会更漂亮:
SELECT *
FROM your_table
WHERE regexp_like(description, '['||chr(128)||chr(129)||...||chr(160)||']')