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

UNO Shintaro uno @ venus.dti.ne.jp
2003年 2月 26日 (水) 14:49:03 JST


>ただ、外側のSELECTで逆に絞りすぎて、妥当な結果の一部も
>切り捨てられているようです。
>
>  t.tel = substring( '入力された値' ,1,
>
>の行を、
>
>  t.tel ~ substring( '入力された値' ,1,
>
>に変えれば良いと思いましたが、間違ってたらご指摘ください。
>例えば、電話番号"046"を入力した場合、
>"046"の"神奈川県厚木市"だけでなく、
>"0467"の"神奈川県鎌倉市"もヒットして欲しい、
>といったケースです。

単純に ~ に変えてしまうと、逆に候補が広がりすぎます。
例えばテーブルに「046」と「0466」のデータがあって「0465」が無い状態で、
入力電話番号を「0465」とすると、substring()の結果は「046」になるので
「0466」も候補に出てきてしまいます。


というわけで、以下のようなSQLでどうでしょう。

SELECT * FROM tel2addr
 WHERE tel LIKE '電話番号' || '%'
UNION
SELECT * FROM tel2addr
 WHERE tel = (SELECT tel FROM tel2addr AS t
               WHERE '電話番号' LIKE t.tel || '%'
               ORDER BY CHAR_LENGTH(t.tel) DESC
               LIMIT 1 OFFSET 0)

UNIONの前側は入力された電話番号が市外局番より短い場合の検索です。
つまり藤本さんが上記でおっしゃっているようなケース用です。

UNIONの後側は入力された電話番号が市外局番より長い場合の検索です。
意味は大島さんからご教示のものと同じです。

この2つの検索結果をUNIONで合わせて検索結果とします。

-- 
UNO Shintaro, 宇野 信太郎
mailto:uno @ venus.dti.ne.jp
http://www.venus.dti.ne.jp/~uno/



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