Я хочу выполнить задачу, если строка ввода содержит любые символы с акцентом, а другая - в SQL. Есть ли способ проверить это условие в SQL?
Ответ 2
Я использую эту функцию для получения текста (в основном иностранных фамилий) для более сопоставимой простой латинской (с некоторыми индивидуалистами), не стесняясь реализовать свои собственные...).
Может быть, вы тоже можете это использовать. Просто сравните, если ваша строка такая же, как и предыдущая.
CREATE FUNCTION [dbo].[GetRunningNumbers](@anzahl INT=1000000, @StartAt INT=0)
RETURNS TABLE
AS
RETURN
SELECT TOP (ISNULL(@anzahl,1000000)) ROW_NUMBER() OVER(ORDER BY A) -1 + ISNULL(@StartAt,0) AS Nmbr
FROM (VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblA(A)
,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblB(B)
,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblC(C)
,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblD(D)
,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblE(E)
,(VALUES(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) AS tblF(F);
GO
CREATE FUNCTION [dbo].[GetTextPlainLatin]
(
@Txt VARCHAR(MAX)
,@CaseSensitive BIT
,@KeepNumbers BIT
,@NonCharReplace VARCHAR(100),@MinusReplace VARCHAR(100)
,@PercentReplace VARCHAR(100),@UnderscoreReplace VARCHAR(100) --for SQL-Masks
,@AsteriskReplace VARCHAR(100),@QuestionmarkReplace VARCHAR(100) --for SQL-Masks (Access-Style)
)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @txtTransformed VARCHAR(MAX)=(SELECT LTRIM(RTRIM(CASE WHEN ISNULL(@CaseSensitive,0)=0 THEN LOWER(@Txt) ELSE @Txt END)));
RETURN
(
SELECT Repl.ASCII_Code
FROM dbo.GetRunningNumbers(LEN(@txtTransformed),1) AS pos
--ASCII-Codes of all characters in your text
CROSS APPLY(SELECT ASCII(SUBSTRING(@txtTransformed,pos.Nmbr,1)) AS ASCII_Code) AS OneChar
--re-code
CROSS APPLY
(
SELECT CASE
WHEN OneChar.ASCII_Code BETWEEN ASCII('A') AND ASCII('Z') THEN CHAR(OneChar.ASCII_Code)
WHEN OneChar.ASCII_Code BETWEEN ASCII('a') AND ASCII('z') THEN CHAR(OneChar.ASCII_Code)
WHEN OneChar.ASCII_Code BETWEEN ASCII('0') AND ASCII('9') AND @KeepNumbers=1 THEN CHAR(OneChar.ASCII_Code)
WHEN OneChar.ASCII_Code = ASCII('ƒ') THEN 'f'
WHEN OneChar.ASCII_Code = ASCII('Š') THEN 'S'
WHEN OneChar.ASCII_Code = ASCII('š') THEN 's'
WHEN OneChar.ASCII_Code = ASCII('ß') THEN 'ss'
WHEN OneChar.ASCII_Code = ASCII('Ä') THEN 'Ae'
WHEN OneChar.ASCII_Code = ASCII('ä') THEN 'ae'
WHEN OneChar.ASCII_Code = ASCII('Æ') THEN 'Ae'
WHEN OneChar.ASCII_Code = ASCII('æ') THEN 'ae'
WHEN OneChar.ASCII_Code = ASCII('Ö') THEN 'Oe'
WHEN OneChar.ASCII_Code = ASCII('ö') THEN 'oe'
WHEN OneChar.ASCII_Code = ASCII('Œ') THEN 'Oe'
WHEN OneChar.ASCII_Code = ASCII('œ') THEN 'oe'
WHEN OneChar.ASCII_Code = ASCII('Ü') THEN 'Ue'
WHEN OneChar.ASCII_Code = ASCII('ü') THEN 'ue'
WHEN OneChar.ASCII_Code = ASCII('Ž') THEN 'Z'
WHEN OneChar.ASCII_Code = ASCII('ž') THEN 'z'
WHEN OneChar.ASCII_Code = ASCII('×') THEN 'x'
WHEN OneChar.ASCII_Code BETWEEN ASCII('À') AND ASCII('Å') THEN 'A'
WHEN OneChar.ASCII_Code BETWEEN ASCII('à') AND ASCII('å') THEN 'a'
WHEN OneChar.ASCII_Code = ASCII('Ç') THEN 'C'
WHEN OneChar.ASCII_Code = ASCII('ç') THEN 'c'
WHEN OneChar.ASCII_Code BETWEEN ASCII('È') AND ASCII('Ë') THEN 'E'
WHEN OneChar.ASCII_Code BETWEEN ASCII('è') AND ASCII('ë') THEN 'e'
WHEN OneChar.ASCII_Code BETWEEN ASCII('Ì') AND ASCII('Ï') THEN 'I'
WHEN OneChar.ASCII_Code BETWEEN ASCII('ì') AND ASCII('ï') THEN 'i'
WHEN OneChar.ASCII_Code = ASCII('Ð') THEN 'D' --island Eth
WHEN OneChar.ASCII_Code = ASCII('ð') THEN 'd' --island eth
WHEN OneChar.ASCII_Code = ASCII('Ñ') THEN 'N'
WHEN OneChar.ASCII_Code = ASCII('ñ') THEN 'n'
WHEN OneChar.ASCII_Code BETWEEN ASCII('Ò') AND ASCII('Ö') THEN 'O'
WHEN OneChar.ASCII_Code BETWEEN ASCII('ò') AND ASCII('ö') THEN 'o'
WHEN OneChar.ASCII_Code = ASCII('Ø') THEN 'O'
WHEN OneChar.ASCII_Code = ASCII('ø') THEN 'o'
WHEN OneChar.ASCII_Code BETWEEN ASCII('Ù') AND ASCII('Ü') THEN 'U'
WHEN OneChar.ASCII_Code BETWEEN ASCII('ù') AND ASCII('ü') THEN 'u'
WHEN OneChar.ASCII_Code = ASCII('Ý') THEN 'Y'
WHEN OneChar.ASCII_Code = ASCII('ý') THEN 'y'
WHEN OneChar.ASCII_Code = ASCII('Þ') THEN 'Th' --island Thorn
WHEN OneChar.ASCII_Code = ASCII('þ') THEN 'th' --island thorn
WHEN OneChar.ASCII_Code = ASCII('Ÿ') THEN 'Y'
WHEN OneChar.ASCII_Code = ASCII('ÿ') THEN 'y'
--Special with "minus"
WHEN OneChar.ASCII_Code = ASCII('-') THEN ISNULL(@MinusReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)))
--Special with mask characters
WHEN OneChar.ASCII_Code = ASCII('%') THEN ISNULL(@PercentReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)))
WHEN OneChar.ASCII_Code = ASCII('_') THEN ISNULL(@UnderscoreReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)))
WHEN OneChar.ASCII_Code = ASCII('*') THEN ISNULL(@AsteriskReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)))
WHEN OneChar.ASCII_Code = ASCII('?') THEN ISNULL(@QuestionmarkReplace,ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code)))
--replace others
ELSE ISNULL(@NonCharReplace,CHAR(OneChar.ASCII_Code))
END AS ASCII_Code
) AS Repl
FOR XML PATH(''),TYPE
).value('.','varchar(max)');
END
GO
SELECT dbo.GetTextPlainLatin('Case sensitive ÄÖ àéêöhello!',1,1,NULL,NULL,NULL,NULL,NULL,NULL);
SELECT dbo.GetTextPlainLatin('Case in-sensitive ÄÖ àéêöhello!',0,1,NULL,NULL,NULL,NULL,NULL,NULL);
GO
DROP FUNCTION dbo.GetTextPlainLatin
GO
DROP FUNCTION dbo.GetRunningNumbers;