- - PR -
データ変換を行うSQL文について
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-17 09:13
こんにちは。
Postgres_MLにも同様の質問を投げておりますが、解決しませんので、 こちらにも投稿させてください。 住所コードテーブルAがあります。 内容は以下の通りです。 code 名称 -------------------------------------- 0 ●●市 1 ●●市▲▲町 2 ●●市××町 3 ●●市■■町 . . . . . . このテーブルをつかって住所よりコードを取得するSQLを書けないか考えています。 たとえば●●市××町10−1であれば2が、●●市×■町8−1なら0がかえって くるようなコードを書けないか考えています。 1つ考えた方法は select code from 住所テーブル where position(名称 in '●●市××町10−1') !=0 ですが、これでは0と2が帰ってきます。 住所テーブルを作成するときに厳密に決めてしまえばこれでも可能なのですが、 そのような仕様になっていないのでこれは使えませんでした。 あとはlike文で住所を1文字ずつ短くしていって検索するという方法も 有るかと思いますが、これではデータベース側に負担がかかるので できる限りやりたくありません。 何か良い方法がありましたら教えてください。 |
|
投稿日時: 2005-08-17 09:29
この住所コードテーブルの名称にはどこまで含まれるのでしょうか?
番地等まで? 案1 住所コードテーブルの構造を見直す。 できれば、郵便番号データ等をダウンロードして、都道府県や市区町村 等で項目を区切ってやればもう少しスムーズに検索可能かと。 案2 Where区に入れる文字列を工夫する。 テーブル構造が変更できないのであれば、今の例ですと Where 名称 Like '●●市××町%' のような指定で抽出できるでしょう。 ただし、問題はどこで文字列をカットするか(町という文字が無い住所も あるので、数字の前までとか...)というのと、都道府県を指定される 場合と省略される場合等指定に統一性を持たせないと抽出できないですね。 一般的には案1で住所というより郵便番号やJISコードでマッチングさせるほうが良 いと思いますが... |
|
投稿日時: 2005-08-17 09:33
> select code from 住所テーブル where position(名称 in '●●市××町10−1') !=0
> ですが、これでは0と2が帰ってきます。 2件返ってきたときにどちらを採用するか「仕様」は決まっていますか? 「名称が長いほう1件を返す」ような仕様なら以下で実現できそうです。 select code from 住所テーブル where position(名称 in '●●市××町10−1') !=0 order by length(名称) desc limit 1 おそらく結果はアプリで利用するものだと思うので無理にSQLで実装する 必要も強くは感じないですが・・・ |
|
投稿日時: 2005-08-17 10:19
Beatleさん、Java僧さん、お返事ありがとうございます。
まず、この住所テーブルですが、現在の仕様では、市または町まではいり、 ユーザー側である程度編集可能になっています。 まずは、「名称が長いほう1件を返す」ような仕様として、作成してみたいと思います。 ありがとうございました。 |
1