0

where句の関数は使用しないことをお勧めします。しかし、次のクエリでは、どうすればそれを回避できますか?

SELECT empID from EmployeeTable
   WHERE UPPER(FirstName) = UPPER(LastName)

はい、この例は非常に単純化されていますが、私は異なるテーブルを結合することについて話しているので、データの大文字と小文字を制御することはできません。大文字と小文字を区別しない場所に書き込む必要があります。

編集:私は実際にOracleとSQLServerの両方のソリューションが必要です。

4

3 に答える 3

3

「where句の関数は使用しないことをお勧めします」

この推奨事項は、次の場合にのみ適用されます。

  1. 列には索引が付けられます。と
  2. 検索でインデックスを使用したいと考えています。

関連するインデックスの詳細を提供しておらず、コード例が「過度に単純化されている」と述べているため、適切なアドバイスを提供できないことは明らかです. ただし、WHERE 句には他の条件がないため、大文字と小文字を区別しないインデックスを に設定する(lastname, firstname)と、投稿したステートメントから期待できる最善の方法は、インデックスの完全な高速スキャンです。

総行数に対するヒット数の比率によっては、フル テーブル スキャンを使用した方が高速な検索が得られる場合があります。その場合、とにかくインデックスを使用したくないので、投稿されたクエリで問題ありません。

このアドバイスは Oracle に適用されます。SQL Server でのパフォーマンスについて、そのプラットフォームで何が最適かを判断するには、十分な知識がありません。重要な点は、クエリの最適化は詳細がすべてであるということです。言及したいほとんどすべての「推奨事項」には、例外または注意事項があります。

于 2013-03-10T10:43:00.947 に答える
2

大文字と小文字が混在するデータでは、UPPER/LOWER を避けることはできません。Oracle で FUNCTION BASED INDEXES を作成して、パフォーマンスを向上させることができます。

http://docs.oracle.com/cd/B28359_01/server.111/b28318/schema.htm#CNCPT1161

http://www.oracle.com/pls/db111/to_URL?remark=ranked&urlname=http:%2F%2Fdownload.oracle.com%2Fdocs%2Fcd%2FB28359_01%2Fserver.111%2Fb28310%2Findexes003.htm%23ADMIN11730

于 2013-03-11T18:28:13.100 に答える
0

collate大文字と小文字を区別しない照合を定義するために使用します

SELECT empID from EmployeeTable
WHERE FirstName = LastName collate Latin1_General_100_CI_AS

SQLFiddle デモ

于 2013-03-10T09:56:06.717 に答える