dポイントプレゼントキャンペーン実施中!

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

以上

A 回答 (3件)

「どうにかしてある項目」をいつ作るかについて。


ORACLEですと関数インデックスを使う場面ですが、
SQLServerでは計算列が使えますね。
    • good
    • 0

元のAテーブルに(1)~(4)の細工を施した「検索用フリガナ」と「元のフリガナ」の2つを持てば良いでしょう。



Aテーブル/元のフリガナ,検索用フリガナ
------------------------------------------
ケンサク キョウタイ,ケンサクキヨウタイ
ケンサク キョウダイ,ケンサクキヨウタイ
ケンサク シマイ,ケンサクシマイ
ケンサク オヤジ,ケンサクオヤシ

で、検索文字に対しても(1)~(4)の処理を行ってから、検索用フリガナでWHEREをかけます。

この時、Replaceなどの小細工は一切要りません。「完全一致」で構いません。

上の例で、検索文字に「ケンサ クキョウ ダイ」を指定すると、検索文字に(1)~(4)の変更が加えられ「ケンサクキヨウタイ」で検索しに行きます。

WHERE [Aテーブル].[検索用フリガナ] = 細工した文字列

になっているので、SQL文で出てくるのは

Aテーブル/元のフリガナ,検索用フリガナ
------------------------------------------
ケンサク キョウタイ,ケンサクキヨウタイ
ケンサク キョウダイ,ケンサクキヨウタイ

の2レコードです。

>処理速度の低下が懸念点です。

「検索を行おうとした時にどうにかしようとする」から、処理速度が落ちるのです。

テーブルにレコードを追加する時や、レコードの更新時に「どうにかしてある項目」を作ってしまえば、あとは、「どうにかしてある項目」と「どうにかしてある検索文字」を完全一致で単純検索するだけです。
    • good
    • 0
この回答へのお礼

chie65535様

ご協力ありがとうございます。

テーブルに検索用フリガナを追加する案も検討していました。
影響範囲が広がるので設定・SQLで対応が出来ない場合の案として考えていましたが、
安心できる案だと再認識しました。

他の案と安心面も念頭に入れて検討してみます。

お礼日時:2011/07/15 16:17

案1


正規表現で検索

LIKE 'ケンサクキ[ヨョ]ウダイ'

案2
独自のストアドファンクションを用意する。
一文字づづ舐めて、(1)~(4)を対応
    • good
    • 0
この回答へのお礼

toda36様

ご協力ありがとうございました。

案1をSQL上で確認したら、欲しい情報が取得できました。

現時点では、chie65535様の案とtoda36様の案1を検討・検証しています。

お忙しい中、本当にありがとうございます。

お礼日時:2011/07/15 16:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!