[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 メーリングリストの案内