我有一个名为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上运行的查询(这是客户端要求)。我怎么能这样做?
答案 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也有一个例子。