[pgsql-jp: 29220] Re: 電話番号から住所を検索するSQL

藤本悟司 satoshi @ try-square.co.jp
2003年 2月 25日 (火) 13:08:00 JST


藤本です。

Kei Yanaihara さんは書きました:
>矢内原@イージーライフです。
>
>神奈川県藤沢市が0466で、神奈川県厚木市が046で始まり次が6以外で
>あるなら、以下のようなデータにすれば良いのでは?
>
> Table: tel2addr
> --------------------------------
> id  |  tel                 |  addr
> ----+--------+---------------------
> 31  | 046([0-5]|[7-9])*    | 神奈川県厚木市
> 32  | 0466*                | 神奈川県藤沢市
>
>以下のSQLで検索できます。
>select addr from tel2addr where '電話番号' ~ tel;
>

とても参考になります。
SQLは簡単で済みますし、実現可能な方法ですね。
ですが、もっとSQL側で手間をかける(データに手間をかけない)
方法が無いものでしょうか。

検索結果に冗長なデータが含まれるのは、そもそもデータレコードに
冗長性が残っているためで、そういったデータを許すテーブル
設計(思想)になっているのだということは、認識しております。

が、実際のデータ収集と整理の手間を考えると、データレコードは
増補的に追加できる形が望ましいかな、と考えています。
つまり、例えば鎌倉市の局番は0467なのですが、これを新たに
追加することを考えると、上記データでは、再び厚木市の
レコードから0467の場合を除外しなければなりません。
このような手間を発生させたくない、というか、そういった依存
のあるデータ設計にしたくない、という考えでおります。

何を言われても勉強になりますので、
他にもいろいろなお考えを聞きたく思います。
よろしくお願いします。

以上。


>
>> やりたいことは、
>>   電話番号の全部または先頭の一部 から、
>>   住所の全部または先頭の一部 を検索する、
>> というものです。
>> 
>> 用意できるデータベースは、次のようなものです。
>> 
>> Table: tel2addr
>> --------------------------------
>> id  |  tel   |  addr
>> ----+--------+---------------------
>>  1  | 03     | 東京都中央区
>>  2  | 03     | 東京都渋谷区
>> ・・・・
>> 30  | 045    | 神奈川県横浜市
>> 31  | 046    | 神奈川県厚木市
>> 32  | 0466   | 神奈川県藤沢市
>> ・・・・
>> 459 | 082486 | 広島県比婆郡高野町
>> 
>> 任意の具体化レベルの電話番号と、任意の具体化レベルの住所
>> の対応が、分かっている限り全て列挙してあります。
>> ただしid=1とid=2のレコードを見てもらえば分かる通り、
>> ある電話番号に対して妥当な住所は複数ありえます。
>> (電話番号:住所=1:n)
>> idの並び順には意味はありません。
>> 
>> ここでユーザに、例えばフォームから、電話番号の一部
>> または全部を入力してもらい、「候補として妥当な住所」を
>> 全て出力したいのですが。
>> 
>> 単純にLIKEを使った前方一致検索では、冗長な結果が出て
>> (例:電話番号0466を入力した場合、藤沢市だけでなく
>>  厚木市も含んでしまう)しまいますので、
>> SELECTした結果から、さらにSELECTで絞り込まなければ
>> ならないのか、また絞り込むといっても、検索で一致した
>> 部分の長さがカギなので、特殊なSQL関数を利用しなければ
>> ならないように思え、そもそも、ひとつのSELECTで済む
>> 簡単な書き方があるのでは、とも考えはじめて、
>> このあたりで挫けてしまいました。。。

----
藤本 悟司

株式会社トライスクエア
〒104-0045 東京都中央区築地3-5-13北村ビル5F
TEL: 03-5148-3345 / FAX: 03-5148-3346
Mobile: 070-6668-4644
E-Mail: satoshi @ try-square.co.jp
WEB: http://www.try-square.co.jp/

Key fingerprint = 95F2 6B3D 0B8C 374A 5E67  CA02 F28F 703A C1A9 8346



pgsql-jp メーリングリストの案内