年龄区间查询SQL
电子商务 2008-05-13 16:27 阅读94 评论0
一、说明
商品表有两个字段:
最小年龄,最大年龄(其中一个字段可以为空,为空则表示n岁以上,m岁以下)
查询有两个参数:
最小年龄,最大年龄(也可以有一个字段为空,意义同上)
建表与示例数据:
CREATE TABLE [ProductForAgeTest]
(
[PKId] [int] IDENTITY (1, 1) NOT NULL,
[ProductCode] [char] (8) NOT NULL,
[ProductName] [varchar] (50) NULL,
[ForAgeMin] [int] NULL,
[ForAgeMax] [int] NULL,
[IsOnline] [bit] NULL DEFAULT (1)
)
ALTER TABLE [ProductForAgeTest] WITH NOCHECK ADD CONSTRAINT [PK_ProductForAgeTest] PRIMARY KEY NONCLUSTERED ( [PKId] )
SET IDENTITY_INSERT [ProductForAgeTest] ON
INSERT [ProductForAgeTest] ([PKId],[ProductCode],[ProductName],[ForAgeMin],[ForAgeMax],[IsOnline]) VALUES ( 1,'J1501002','遥控仿真童车',4,8,1)
INSERT [ProductForAgeTest] ([PKId],[ProductCode],[ProductName],[ForAgeMin],[IsOnline]) VALUES ( 2,'J1501003','星河战车童车',4,1)
INSERT [ProductForAgeTest] ([PKId],[ProductCode],[ProductName],[ForAgeMax],[IsOnline]) VALUES ( 3,'J1501004','宠物童车',8,1)
SET IDENTITY_INSERT [ProductForAgeTest] OFF
二、查询原理:
看两个区间段是否存在交集,最小年龄或最大年龄为空则视为极限值0-99。
select PKId,ProductCode,ProductName,ForAgeMin,ForAgeMax from ProductForAgeTest where IsOnline=1
go
declare @q_min int
declare @q_max int
--set @q_min=3 set @q_max=5
--set @q_min=4 set @q_max=6
--set @q_min=6 set @q_max=8
--set @q_min=7 set @q_max=9
--set @q_min=5 set @q_max=7
--set @q_min=3 set @q_max=9
--set @q_min=3 set @q_max=4
--set @q_min=8 set @q_max=9
--set @q_min=0 set @q_max=99--全部商品
if(@q_min is null) set @q_min=0
if(@q_max is null) set @q_max=99
select PKId,ProductCode,ProductName,ForAgeMin,ForAgeMax
from ProductForAgeTest
where
IsOnline=1 and
(
(@q_min<=isnull(ForAgeMin,0) and @q_max>isnull(ForAgeMin,0))
or
(@q_min> isnull(ForAgeMin,0) and @q_min<isnull(ForAgeMax,99))
)
--年龄begin---------------------------------------------------------
--不管是产品的年龄,还是查询的年龄,只要为空就置为极限值(0-99)
--(Products.ForAgeMin >= @age_min and Products.ForAgeMin < @age_max)
--OR
--(Products.ForAgeMin < @age_min and Products.ForAgeMax < @age_min)
--年龄end-----------------------------------------------------------