2009-07-20 17 views
0

連絡先に郵便番号の範囲をマッピングするテーブルがあります。郵便番号は、各国ごとに複数の形式で保存されます。SQL Server BETWEEN問題

表郵便番号範囲:

 
FROM-CODE TO-CODE CONTACT-ID COUNTRY-CODE 
12000  12999  18   fr 
BT000000 BT9ZZZZZ 34   uk 
... 

特定範囲内の連絡先を検索するには、例えば範囲123で始まる、私は、次のクエリを使用する:

select * from postcode-range
where '123' between from-code and to-code
and country-code = 'fr'

これは最初のエントリを返し、非接触IDを18

Iは'120'又はを検索する場合に問題があります'12'私は結果を得ません。

何が間違っていますか?誰か別のSQLクエリがありますか?

答えて

4

「12」<「120」<「12000」

それが含まれるであろうが、あなたは、書かれたクエリが動作します「FR」は「12」にコードからとにあなたを変えると「12999」の場合おそらく有効なフランスの郵便番号ではない「121AB」のようなパターン。文字列に数字または長さだけが含まれているかどうかのテストなど、他の検証を含めることもできます。

あなたが第一3つの文字を取得するには「'12%LIKE
または使用LPADを使用することができ

like '12[0-9][0-9][0-9]' 
1

私はこの解決策を見つけた:

select * from postcode-range 
where country-code = 'fr' 
and left('12' + '00000000000000', len(from-code)) between from-code and to-code 

クエリは郵便番号の必要な長さよりも短い場合は、不足している文字はゼロで満たされています。私は、郵便番号が14文字を超えていないと仮定します。

国コードとクエリ(ここでは'12')は単なるプレースホルダです。