Как я могу удалить акценты на строке?

У меня есть следующая строка

áéíóú

который мне нужно преобразовать в

aeiou

Как мне этого добиться? (Мне не нужно сравнивать, мне нужно сохранить новую строку)

6 ответов

Решение

Попробуйте использовать COLLATE:

select 'áéíóú' collate SQL_Latin1_General_Cp1251_CS_AS

Для данных Unicode попробуйте следующее:

select cast(N'áéíóú' as varchar(max)) collate SQL_Latin1_General_Cp1251_CS_AS

Я не уверен, что вы можете потерять в переводе при использовании второго подхода.

Обновить

Это выглядит как œ это особый случай, и мы должны обрабатывать верхний и нижний регистр отдельно. Вы можете сделать это следующим образом (этот код является хорошим кандидатом для пользовательской функции):

declare @str nvarchar(max) = N'ñaàeéêèioô; Œuf un œuf'
select cast(
    replace((
        replace(@str collate Latin1_General_CS_AS, 'Œ' collate Latin1_General_CS_AS, 'OE' collate Latin1_General_CS_AS) 
    ) collate Latin1_General_CS_AS, 'œ' collate Latin1_General_CS_AS, 'oe' collate Latin1_General_CS_AS) as varchar(max)
) collate SQL_Latin1_General_Cp1251_CS_AS 
-- Output:
-- naaeeeeioo; Oeuf un oeuf

Используйте функцию перевода:

SELECT TRANSLATE(
N'INPUT: ïÜ×ÌùµŪč©īĐÃÙěÓńÿâŘåòÔÕłćýçÀŻūìóèůüíÄûØõäÕťżîŃà£êřßøŽÖáďÉęúÂĪāËžŮōÑÇĆź®Š¥ĘĒśŹĚŚšŸ¢ŁéąÈđÆÍÛĄÝĎēČÊŌŇöÏňëÎæãŤñÒÚĀÅÁô',
N'ÁÀÂÃÄÅàáâãäåĀāąĄæÆÇçćĆčČ¢©đĐďĎÈÉÊËèéêëěĚĒēęĘÌÍÎÏìíîïĪīłŁ£ÑñňŇńŃÒÓÔÕÕÖØòóôõöøŌōřŘ®ŠšśŚßťŤÙÚÛÜùúûüůŮŪūµ×¥ŸÿýÝŽžżŻźŹ', 
N'aaaaaaaaaaaaaaaaaaccccccccddddeeeeeeeeeeeeeeiiiiiiiiiilllnnnnnooooooooooooooooorrsssssttuuuuuuuuuuuuuxyyyyyzzzzzz');

-- OUTPUT: 'INPUT: iuxiuuuccidaueonyaraooolcycazuioeuuiauooaotzioaleosozoadeeuaiaezuoncczrsyeeszessycleaedaiuaydeceonoineiaatnouaaao'

Перейдите по этой ссылке, чтобы найти больше похожих персонажей:

https://github.com/apache/lucene-solr/blob/1ca7067a810578d4e246b5434b9cdcec7145d230/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.java

Иногда у строки может быть другая COLLATION, так что в результате все еще остаются акценты. В этом случае вы можете использовать эту строку ( на основе этого решения здесь):

SELECT convert(varchar, your_string) COLLATE SQL_Latin1_General_Cp1251_CS_AS;

У меня такая же проблема. На греческом языке для правильного преобразования в UPPER() вы должны подавить ударение. Изменение параметров сортировки вызвало проблемы в других приложениях. Помещая некоторые функции REPLACE(), я мог лучше контролировать поведение, поддерживающее параметры сортировки. Ниже моя функция ToUpperCaseGR.

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    create FUNCTION ToUpperCaseGR
    (
     @word nvarchar(max)
    )
    RETURNS nvarchar(max)
    AS
    BEGIN
        -- Declare the return variable here
        declare @res nvarchar(max)
        set @res = UPPER(@word)
        set @res = replace(@res,'Ά','Α')
        set @res = replace(@res,'Έ','Ε')
        set @res = replace(@res,'Ί','Ι')
        set @res = replace(@res,'Ή','Η')
        set @res = replace(@res,'Ό','Ο')
        set @res = replace(@res,'Ύ','Υ')
        set @res = replace(@res,'Ώ','Ω')


        -- Return the result of the function
        RETURN @res

    END
    GO

Используйте функцию TRANSLATE() вместе с COLLATE и нечувствительным к диакритическому знаку (AI) сопоставление, чтобы сделать простую универсальную замену:

      SELECT TRANSLATE('TÉST ínpüt' COLLATE Latin1_General_CS_AI, 'AEIOUaeiou', 'AEIOUaeiou')

-- OUTPUT: 'TEST input'

Используйте эту функцию:

CREATE FUNCTION [dbo].[F_RemoveDiacritics] (
 @String varchar(max)
)   RETURNS varchar(max)

AS BEGIN
DECLARE @StringResult VARCHAR(max);

select @StringResult= @String collate SQL_Latin1_General_Cp1251_CS_AS

return @StringResult


END
Другие вопросы по тегам