2011-07-14 11 views
0

ユーザーがアドレスを検索できるデータベースがあります。ただし、データベースの一部のアドレスは範囲内にリストされています。たとえば、120-125のメインstはデータベースのレコードになります。ユーザーが123 Main Stを検索した場合、120-125のレコードを表示する方法はありますか? BETWEEN句が正しく動作するかどうかわからないので、これはすべての範囲を含めるためには動的である必要があります。何か案は?任意の範囲内の値を検索する

+0

あなたは、あなたのデータがどのように見えているのか、どんなことが好きなのかのサンプルを提供できますか?ありがとう! – jworrin

答えて

1

このような種類のデータには、多くの頭痛や頭痛の種を保存して専用のフィールドを作成します。あなたも、アドレスを解析し、トリガー(挿入した後、更新)の助けを借りて、これらのフィールドを埋める機能を作成することができます:

create function rangeFrom(@address varchar(100)) returns int as 
begin 
    declare @pos int 

    set @address = replace(@address, ' ', '') + '.' 

    set @pos = patindex('%[0-9]%', @address) 
    if @pos > 0 
    begin 
    set @address = right(@address, len(@address) - @pos + 1) 
    set @pos = patindex('%[0-9][^0-9]%', @address) 
    return left(@address, @pos) 
    end 
    return null 
end 
-- ------------------------------------------------------------ 
create function rangeTo(@address varchar(100)) returns int as 
begin 
    declare @pos int 

    set @address = replace(@address, ' ', '') + '.' 

    set @pos = patindex('%[0-9]-[0-9]%', @address) 
    if @pos > 0 
    begin 
    set @address = right(@address, len(@address) - @pos - 1) 
    set @pos = patindex('%[0-9][^0-9]%', @address) 
    return left(@address, @pos) 
    end 
    return null 
end 

その後、あなたは(あなたのトリガーに例えば)それらを呼び出すことができます。

select dbo.rangeFrom('120-125 main st') -- returns 120 
select dbo.rangeTo('120-125 main st') -- returns 125 

このように、BETWEEN演算子で使用できる実際のフィールドがあります。

+0

ありがとう、私はこれに少し新しいですので、構文がどのように行くのか分かりません。これらの関数はどちらもストアドプロシージャとして作成し、実際のSQLクエリで正しく呼び出す必要がありますか? – Aeonstrife

+0

@Aeonstrife:彼らはあなたがこれらのステートメントを実行して、データベース内の[ユーザー定義関数](http://msdn.microsoft.com/en-us/library/ms191007.aspx)(保管されていない手順)として作成されます。その後、トリガーなどで使用するか、行を挿入または更新するときに明示的に使用できます。 – Tomalak

0

正規表現を使用して、アドレス行から "x-yメインストリート"からxとyの値を抽出し、検索値が抽出された2つの値の間にあるかどうかを確認できます。

地理的に同じ通りのレコードを探していることを確認するには、ZIP /郵便番号で一致してください(範囲が重複しないようにする必要があります)。

あなたが別々の列に定義された範囲を持たずに、これを行うことができるようになりますどのように他わからないが、私の解決策は、華麗ではないですが、あなたは、文字列操作を使用するように強制している場合、うまくいけば、それはあなたを助けます。

関連する問題