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