1

我在自动取款机上有点困惑,我在一个需要小搜索的房地产网站上工作,问题是一些列表有一个价格范围,例如从 10,000 美元到 25,000 美元,其他只有固定价格。

所以我的数据库看起来像这样:

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

搜索包含 2 个字段:minPriceRange 和 maxPriceRange,例如,当用户搜索价格范围内的列表时:minPriceRange = 8000 和 maxPriceRange = 17000,则应该显示列表 1、2 和 3。

我对如何在 SQL 语句中处理这个问题有点困惑。

所以它必须检查价格是否在 min 和 maxPrice 之间,但还要考虑到价格可以单独设置

编辑

我知道这可能有点令人困惑。

所以基本上当我搜索 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

根据其他需求,情况可能并非如此,但可靠的数据库设计至关重要。我必须重写的大多数应用程序都已经完成,因为一些以前的程序员(通常是以前的程序员是我)没有彻底考虑数据库设计,我们基于有缺陷的设计陷入了困境。

也就是说,使用当前的数据库设计,您可以使用括号对 where 子句进行分组 (信用到期,此查询的 99% 来自 rs。我必须修改一项才能使其工作。)

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

如何根据价格范围进行选择,然后使用并集将固定价格的结果相加?

寻找价格在 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 回答
0
SELECT * FROM table
WHERE
    price BETWEEN :min AND :max
OR (
    minPrice <= :min AND maxPrice >= :min
)
于 2012-05-30T14:06:16.163 回答
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

我会把这个查询写成:

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

这将逻辑保持在一个地方,只需在前者不可用时用价格替换最小值和最大值。

于 2012-05-30T15:37:39.920 回答