- 締切済み
SQL Serverでの検索時の文字の同一視
SQL Serverでの検索について教えてください。 【目的】 ・JAVAで作成した検索画面より、SQLServerのテーブルに対して検索をしたい。 ・フリガナ検索で、以下のルールを設けたい (1)カタカナ小文字(『ッ』『ャ』等)とカタカナ大文字(それぞれ、『ツ』『ヤ』)を区別せず、同一視したい (2)濁音(『バ』)・破裂音(『パ』)・清音(『ハ』)を区別せず、同一視したい (3)半角スペースと全角スペースを無視したい (4)アルファベット小文字(『a』等)とアルファベット大文字(『A』)を区別せず、同一視した ≪例≫ Aテーブル/フリガナ : ケンサク キョウダイ 検索ワード ・ケンサク キョウダイ(完全一致) ・・・ ○ ・ケンサク キヨウダイ(上記(1)) ・・・ ○ ・ケンサク キョウタイ(上記(2)) ・・・ ○ ・ケンサクキョウダイ(上記(3)) ・・・ ○ という結果にしたい。 【現時点】 ・照合順序をSQL文でしようしたら、 (2)は『AI』で対応できました。 (4)は『CI』で対応できました。 ・(3)はSQL文のWhere句に、半角スペースを無効にする『Replace』と全角スペースを無効にする『Replace』を記述することで対応できました。 ・(1)だけがどうしても対応できません。 →(3)の対応と同様に『Replace』での対応も可能なのですが、9つ程度(『ッ』『ャ』『ュ』『ョ』『ァ』『ィ』『ゥ』『ェ』『ォ』)追加しないといけないので、処理速度の低下が懸念点です。 どなたかいい方法をお持ちの方がいましたら、ご協力お願いいたします。 ■バージョン:10.50.1600.1 以上
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- yorozu_ya
- ベストアンサー率54% (76/140)
「どうにかしてある項目」をいつ作るかについて。 ORACLEですと関数インデックスを使う場面ですが、 SQLServerでは計算列が使えますね。
- chie65536(@chie65535)
- ベストアンサー率44% (8754/19864)
元のAテーブルに(1)~(4)の細工を施した「検索用フリガナ」と「元のフリガナ」の2つを持てば良いでしょう。 Aテーブル/元のフリガナ,検索用フリガナ ------------------------------------------ ケンサク キョウタイ,ケンサクキヨウタイ ケンサク キョウダイ,ケンサクキヨウタイ ケンサク シマイ,ケンサクシマイ ケンサク オヤジ,ケンサクオヤシ で、検索文字に対しても(1)~(4)の処理を行ってから、検索用フリガナでWHEREをかけます。 この時、Replaceなどの小細工は一切要りません。「完全一致」で構いません。 上の例で、検索文字に「ケンサ クキョウ ダイ」を指定すると、検索文字に(1)~(4)の変更が加えられ「ケンサクキヨウタイ」で検索しに行きます。 WHERE [Aテーブル].[検索用フリガナ] = 細工した文字列 になっているので、SQL文で出てくるのは Aテーブル/元のフリガナ,検索用フリガナ ------------------------------------------ ケンサク キョウタイ,ケンサクキヨウタイ ケンサク キョウダイ,ケンサクキヨウタイ の2レコードです。 >処理速度の低下が懸念点です。 「検索を行おうとした時にどうにかしようとする」から、処理速度が落ちるのです。 テーブルにレコードを追加する時や、レコードの更新時に「どうにかしてある項目」を作ってしまえば、あとは、「どうにかしてある項目」と「どうにかしてある検索文字」を完全一致で単純検索するだけです。
- todo36
- ベストアンサー率58% (728/1234)
案1 正規表現で検索 LIKE 'ケンサクキ[ヨョ]ウダイ' 案2 独自のストアドファンクションを用意する。 一文字づづ舐めて、(1)~(4)を対応
お礼
toda36様 ご協力ありがとうございました。 案1をSQL上で確認したら、欲しい情報が取得できました。 現時点では、chie65535様の案とtoda36様の案1を検討・検証しています。 お忙しい中、本当にありがとうございます。
お礼
chie65535様 ご協力ありがとうございます。 テーブルに検索用フリガナを追加する案も検討していました。 影響範囲が広がるので設定・SQLで対応が出来ない場合の案として考えていましたが、 安心できる案だと再認識しました。 他の案と安心面も念頭に入れて検討してみます。