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

藤本悟司 satoshi @ try-square.co.jp
2003年 2月 25日 (火) 11:45:52 JST


はじめて投稿いたします。
藤本と申します。

PostgreSQL-7.3を利用しています。

SQL初心者で、下記のような問題でつまづいております。
どなたか、アドバイス頂けませんか。

やりたいことは、
  電話番号の全部または先頭の一部 から、
  住所の全部または先頭の一部 を検索する、
というものです。

用意できるデータベースは、次のようなものです。

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で済む
簡単な書き方があるのでは、とも考えはじめて、
このあたりで挫けてしまいました。。。

例題集にも出てきそうな、基本的な問題なのですが。
C言語などの手続き型プログラミングならば、ある程度
経験があるのですが、もっと代数的なロジックといいますか、
SQL的な考え方のようなものに慣れておらず、
プログラミングとは根本から違う問題の捉え方が
必要なのだと思いました。

また、こういったSQLセンスを磨くのに良い書籍や
例題集などありましたら、ご紹介ください。

よろしくお願いします。

----
藤本 悟司

株式会社トライスクエア
〒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 メーリングリストの案内