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 上也有一个例子。
我有一个名为 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 上也有一个例子。