1

ラテン文字/アクセント付き文字を基本的なアルファベット文字に置き換え、変換できないものをすべて取り除きたい

例:

'ë' to be replaced with 'e'
'ß' to be replaced with 's' , 'ss' if possible, if neither then strip it

私はこれをC#コードで行うことができますが、MSSQLで何日もかからずにこれを解決する経験がありません

更新: varchar 列のデータは、通常の UNICODE テキストを持つ必要がある別のテーブルのトリガーから入力されます。さらに処理するために、関数でテキストを ascii7 に変換したいと考えています。

更新: これが SQL でのみ実行でき、カスタム文字のマッピングを回避するソリューションを好みます。これを行うことができますか、それとも現在不可能ですか?

4

1 に答える 1

3

Aaron が言ったように、マッピング テーブルを完全に SQL で処理することはできないと思いますが、文字を ASCII-7 にマッピングするには、AI 照合と組み合わせて使用​​するかなり単純なテーブルを使用する必要があります。ここには 2 つのテーブルがあり、1 つは列内の文字をマップするためのもので、もう 1 つはアルファベット文字のためのものです (必要に応じて拡張できます)。

AI 照合を使用することで、多くの明示的なマッピング定義を回避できます。

-----------------------------------------------
-- One time mapping table setup
CREATE TABLE t4000(i INT PRIMARY KEY);
GO

INSERT INTO t4000 --Just a simple list of integers from 1 to 4000
SELECT ROW_NUMBER()OVER(ORDER BY a.x)
FROM (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) a(x)
CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) b(x)
CROSS APPLY (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) c(x)
CROSS APPLY (VALUES(1),(2),(3),(4)) d(x)
GO

CREATE TABLE TargetChars(ch NVARCHAR(2) COLLATE Latin1_General_CS_AI PRIMARY KEY);
GO

INSERT TargetChars -- A-Z, a-z, ss
SELECT TOP(128) CHAR(i)
FROM t4000
WHERE i BETWEEN 65 AND 90
    OR i BETWEEN 97 AND 122
UNION ALL
SELECT 'ss'
-- plus any other special targets here
GO

-----------------------------------------------
-- function
CREATE FUNCTION dbo.TrToA7(@str NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS
BEGIN
    DECLARE @mapped NVARCHAR(4000) = '';
    SELECT TOP(LEN(@str))
    @mapped += ISNULL(tc.ch, SUBSTRING(@str, i, 1))
    FROM t4000
    LEFT JOIN TargetChars tc ON tc.ch = SUBSTRING(@str, i, 1)
    COLLATE Latin1_General_CS_AI;

    RETURN @mapped;
END
GO

使用例:

SELECT dbo.TrToA7('It was not á tötal löß.');

結果:

--------------------------
It was not a total loss.
于 2012-06-23T16:40:37.173 に答える