1

ATM が少し混乱しています。小さな検索が必要な不動産 Web サイトに取り組んでいます。問題は、一部のリストには価格帯 (例: $10,000 から $25,000) があり、他のリストには固定価格しかないことです。

したがって、私のデータベースは次のようになります。

id | price | minPrice | maxPrice
1  |       | 10000    | 45000
2  | 7500  |          |
3  |       | 15000    | 20000
4  | 80000 |          |

検索は、minPriceRange と maxPriceRange の 2 つのフィールドで構成されます。たとえば、ユーザーが minPriceRange = 8000 と maxPriceRange = 17000 の価格範囲でリストを検索すると、リスト 1、2、3 が表示されます。

SQL ステートメントでこれを処理する方法について少し混乱しています。

したがって、価格が最小価格と最大価格の間にあるかどうかを確認する必要がありますが、価格を個別に設定できることも考慮に入れる必要があります

編集

これは少し混乱するかもしれません。

基本的に、12000 から 60000 の間のリストを検索すると、リスト 1 と 3 が表示されるはずです。

そのため、minPrice >= 5000 AND maxPrice <= 60000 を実行することはできません。

4

8 に答える 8

4
Select id from tablename where (minPrice >= 8000 and maxPrice <=17000) or (price between 8000 and 17000)
于 2012-05-30T14:02:21.223 に答える
2

価格の列を削除するようにデザインを変更し、価格が設定されている住宅の場合は、最小価格と最大価格を同じ価格に設定する方がよい場合があります。

id | minPrice | maxPrice
1  | 10000    | 45000
2  | 7500     | 7500
3  | 15000    | 20000
4  | 80000    | 80000

他のニーズによってはそうではない場合もありますが、堅実なDB設計が重要です。私が書き直さなければならなかったほとんどのアプリは、以前のプログラマー(以前のプログラマーは私であることが多い)がDB設計を完全に熟考していなかったために行われ、欠陥のある設計に基づいてコーナーに戻った。

とは言うものの、現在のDB設計では、括弧を使用してwhere句をグループ化できます (クレジットが必要なクレジット、このクエリの99%はrsからのものでした。機能させるには、1つのアイテムを変更する必要がありました)。

DECLARE @pricemin int = 8000 
DECLARE @pricemax int = 17000 
SELECT * FROM tableName WHERE (ISNULL(minPrice,0) <= @pricemin  
AND    @pricemax <= ISNULL(maxPrice,2147483647))   -- 2147483647 is max Int Value in SQL Server - adjust as necessary
or ISNULL(price,0) between @pricemin and @pricemax 
于 2012-05-30T14:03:54.000 に答える
2

これは動作するはずです:[更新]

DECLARE @table table (id int, price int, minPrice int, maxPrice int)
INSERT into @table 
SELECT 1, null, 10000, 450000 UNION
SELECT 2,7500,null,null UNION
SELECT 3,null,15000  ,20000 UNION
SELECT 4,80000, null,null    

DECLARE @pricemin int = 8000
DECLARE @pricemax int = 17000
SELECT * FROM @table WHERE (minPrice <= @pricemin or minPrice is null) 
AND    (@pricemax <= maxPrice or maxPrice is null) 
or ISNULL(price,0) between @pricemin and @pricemax
于 2012-05-30T14:12:04.847 に答える
2
DECLARE @table table (id int, price int, minPrice int, maxPrice int)
INSERT into @table 
SELECT 1, null, 10000, 450000 UNION
SELECT 2,7500,null,null UNION
SELECT 3,null,15000  ,20000 UNION
SELECT 4,80000, null,null  

DECLARE @pricemin int = 15000
DECLARE @pricemax int = 90000

SELECT * FROM @table
WHERE (((minPrice IS NOT NULL AND minPrice <= @pricemin)
   AND (maxPRICE IS NOT NULL AND maxPrice >= @pricemax))
   OR
   (price IS NOT NULL AND (( price >= @pricemin) AND (price <= @pricemax))))
于 2012-05-30T14:52:27.067 に答える
0
SELECT * FROM table
WHERE
    price BETWEEN :min AND :max
OR (
    minPrice <= :min AND maxPrice >= :min
)
于 2012-05-30T14:06:16.163 に答える
0

このクエリを次のように記述します。

select *
from t
where <usermin> >= coalesce(minprice, price) and
      <usermax> <= coalesce(maxprice, price)

これにより、前者が利用できない場合に最小値と最大値を価格に置き換えるだけで、ロジックが 1 か所に保持されます。

于 2012-05-30T15:37:39.920 に答える
0

混乱を避けるために、新しい回答として投稿します。頭をもう少し壊した後、最終的にこれを思いつきました:

(((minPrice IS NOT NULL AND minPrice >= 10000) AND (minPrice IS NOT NULL AND minPrice <= 15000)) 
OR 
((maxPrice IS NOT NULL AND maxPrice >= 10000) AND (maxPrice IS NOT NULL AND maxPrice <= 15000))) 
OR
(price IS NOT NULL AND (( price >= 10000) AND (price <= 15000)))

これは、最小価格と最大価格を選択する場合に機能しますが、最小価格が 0 の場合は、考えられるすべての結果を選択するだけです。

于 2012-05-30T15:37:31.880 に答える
0

価格帯に基づいて選択し、ユニオンを使用して固定価格からの結果を追加するのはどうですか?

10,000 から 20,000 の間の価格を探している顧客の疑似コード試行

SELECT id FROM table WHERE price BETWEEN 10,000 AND 20,000
UNION
SELECT id FROM table WHERE minPrice > 10,000 AND maxprice < 20,000
于 2012-05-30T14:00:35.467 に答える