この問題は、アクセントを区別しない照合を使用して解決できます。
データベースはおそらくAS(Accent Sensitive)照合を使用しているため、デフォルトではアクセントを含む完全一致を検索します。
比較で照合を指定することにより、データベースのデフォルト以外の照合を使用するようにWHERE句に指示できます。
で、このdbfiddle私はLATIN1照合順序を使用した例を作成しましたが、あなたは自分の列が現在使用して照合にAIにASを変更することで、使用している照合と同じアプローチを使用することができます。
コロンが使用している照合と一致するAccent Insensitive照合を使用します。カラムが使用される場合、例えばSQL_Latin1_General_CP1_CI_AS
、使用しSQL_Latin1_General_CP1_CI_AI
なくLatin1_General_CI_AS
またはLatin1_General_100_CI_AS
または非SQL_照合の挙動のでこれら二つの変形のいずれかだけアクセント鈍感以上の方法で異なるであろう、そしてそれは、ユーザーが期待できない場合があります。
現在の照合はで確認できますsys.columns
。
CREATE TABLE testaccent (name nvarchar(50));
GO
INSERT INTO testaccent (name) VALUES ('Millière') , ('Milliere');
GO
-- returns Miliere
SELECT * FROM testaccent WHERE name = 'Milliere';
-- returns both
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AI
--only returns Miliere
SELECT * FROM testaccent WHERE name='Milliere' COLLATE Latin1_General_CI_AS
詳細については、「SQL Server照合の使用」をお読みください。
その後、再び、あなたはおそらく(この照合を使用するように並べ替えたいと思いpeufeuはコメントで指摘)「E」と「E」をソートすることを確実にするために。そうしないと、アルファベット順に結果をページングする人は、予想される「é」が見つからないことに驚かれますが、このクエリに触れたいだけであれば、COLLATE
句を追加することORDER BY
もできます。
で述べたように、ソロモンRutzkyコメントでこれが唯一の1またはいくつかの列に影響を与える場合、別のオプションは、単に「名前」欄を繰り返し、アクセントを区別しない照合を提供し、その後、指数計算されたことを非永続計算列を作成することですカラム。これにより、クエリ内の照合順序を変更することによるスキャンを回避できます。次に、クエリは新しい列でフィルタリングする必要があります。
何かのようなもの:
ALTER TABLE
dbo.[table_name] ADD [SearchName] datatype_of_name_column
AS ([Name] COLLATE LATIN1_GENERAL_100_CI_AI));
CREATE INDEX [IX_table_name_SearchName]
ON dbo.[table_name] ([SearchName] ASC);
または、計算列を追加する代わりにビューを作成することもできます(jyaoが好むように)。