SQL 服务器和 Oracle 查询忽略重音

SQL Server and Oracle query ignoring accents

我有一个名为 A 的 table 和一个名为 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",它应该 return 示例中的第 1 行和第 3 行。

我试过类似的方法:

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

但是没用。

我也尝试过使用 NLS_SORT,但它仅适用于 Oracle,我需要一个同时适用于 SQL 服务器和 Oracle 的查询(这是客户端要求)。我该怎么做?

一个问题是 Microsoft SQL 服务器直到 2017 年才具有翻译功能。现在有,但由于它不适合您,您可能还没有使用此版本。

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

Microsoft SQL 服务器文档对此进行了解释:https://docs.microsoft.com/en-us/sql/t-sql/functions/translate-transact-sql

您还应该了解 Oracle 和 SQL Server 中使用的字符编码。使用翻译和替换功能你应该没问题,但如果你通过文件传输数据,那将很重要。我在以下位置描述了更多内容:http://www.thedatastudio.net/dodgy_characters.htm

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

select
  replace
  (
    replace
    (
      replace
      (
        replace
        (
          'ABÇDÉFGHÍJÁBÇDÉFGHÍJ', 'Á', 'A'
        ), 'Ç', 'C'
      ), 'É', 'E'
    ), 'Í', 'I'
  ) as clean_keyword;

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

结果是:

ABCDEFGHIJABCDEFGHIJ

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