SQL Server和Oracle查询忽略重音

时间:2018-01-16 10:42:15

标签: sql sql-server oracle diacritics

我有一个名为A的表和一个名为Keywords Varchar(255)的列。关键字列可以包含字符串,如“TEST,CÃO,ódio”等等......有或没有重音:

ID  Keywords
1   TEST, CÃO, ódio, oracle, SQL, açaí
2   Valor, Deputado Rafael, Costelão, estilo
3   São Sebastião, cao, projeto de lei

我正在尝试创建一个SQL查询来比较忽略巴西口音的字符串(áéíóúç等等)。因此,如果用户搜索“cao”,它应返回示例中的第1行和第3行。

我尝试过类似的事情:

SELECT keywords
FROM A WHERE UPPER(TRANSLATE(keywords,  
'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü','ACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu'))
LIKE UPPER((TRANSLATE('%cao%',
  'ÁÇÉÍÓÚÀÈÌÒÙÂÊÎÔÛÃÕËÜáçéíóúàèìòùâêîôûãõëü', 'ACEIOUAEIOUAEIOUAOEUaceiouaeiouaeiouaoeu')));

但它不起作用。

我也尝试过使用NLS_SORT,但它仅适用于Oracle,我需要一个可以在SQL Server和Oracle上运行的查询(这是客户端要求)。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

一个问题是Microsoft SQL Server在2017年之前没有翻译功能。它现在可以,但由于它不适合您,您可能还没有使用此版本。

您可以改为执行嵌套替换。这并不难,但编写起来很乏味。一旦编写和测试,它就没问题了。

Microsoft SQL Server文档解释了这一点:https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql

您还应该了解Oracle和SQL Server中使用的字符编码。使用翻译和替换功能,您应该没问题,但如果您通过文件传输数据,那将非常重要。我在http://www.thedatastudio.net/dodgy_characters.htm

描述了更多内容

以下是您要翻译的前几个字符的示例:

ABCDEFGHIJABCDEFGHIJ

只需将您的关键字替换为'ABÇDÉFGHÍJÁBÇDÉFGHÍJ'。

结果是:

addUser(user: User) {
const  headers = new Headers();

headers.append('content-type', 'application/json');
headers.append('Authorization', 'Bearer ' + this.authenticationService.token);
return this.http.post(this.uri, JSON.stringify(user), {headers : headers})
.map(res => res.json());
}

https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql也有一个例子。

相关问题