我正在尝试查找具有重音字符的数据。我试过这个:
select *
from xml_tmp
where regexp_like (XMLTYpe.getClobVal(xml_tmp.xml_data), unistr('\0090'))
它有效。它查找XML数据字段包含É的所有记录。问题是它只匹配带有重音的大写字母E.我尝试编写一个更通用的查询,使用等价类查找带有重音元音(a,e,i,o,u,大写和小写,带有任何重音符号)的所有数据。我想要一个正则表达式匹配仅重音元音,但我不知道如何获得它,因为[[=e=]]
等等类匹配所有 e(带有或没有口音)。
此外,这实际上不起作用:
select *
from xml_tmp
where regexp_like (XMLTYpe.getClobVal(xml_data),'É');
(使用Oracle 10g)
答案 0 :(得分:2)
怎么样
SELECT *
FROM xml_tmp
WHERE REGEXP_LIKE
( REGEXP_REPLACE
( XMLTYpe.getClobVal(xml_tmp.xml_data),
'[aeiouAEIOU]',
'-'
)
'[[=a=][=e=][=i=][=o=][=u=]]'
)
;
?这将在执行REGEXP_LIKE
之前消除任何无重音元音。
(这很难看,我知道。但它应该有效。)
答案 1 :(得分:2)
经过一些实验,我发现这似乎没问题:
select *
from xml_tmp
where regexp_like(XMLTYpe.getClobVal(xml_data),'[^[:graph:][:space:]]')
我原以为[:graph:]
会包含所有大写和小写字符,有或没有重音符号,但它似乎只匹配 unaccented 字符。
进一步的实验表明,这可能并不适用于所有情况。试试这些问题:
select *
from dual
where regexp_like (unistr('\0090'),'[^[:graph:][:space:]]');
DUMMY ------- X (the match succeeded)
所以看起来让我遇到麻烦的角色符合这种模式。
select *
from dual
where regexp_like ('É','[^[:graph:][:space:]]');
DUMMY ------- (the match failed)
当我尝试使用重音E复制并粘贴时运行此查询时,匹配失败!我猜我复制和粘贴的东西实际上是不同的。呃,我想我现在讨厌改变角色编码。