【发布时间】:2021-04-02 17:53:12
【问题描述】:
由于业务复杂性,我们必须有一个动态条件表。
我们的表格叫做“规则”
它有这个结构
ID Field Op Unit Value Discount
==========================================================
1 Gender = NULL Male 0.07
2 Gender = NULL Female 0.08
3 Age >= Year 60 0.02
4 Age = Year 18 0.09
5 Age <= Month 6 0.04
6 Height <= NULL 150 0.03
7 Height >= NULL 165 0.06
我正在尝试仅选择与客户数据匹配的记录
DECLARE @Gender varchar(10) = 'Male'
DECLARE @Age int = 70 -- In months
SELECT *
FROM Rules
WHERE (Field = 'Gender' AND Value = @Gender) OR
(@Age/12 BETWEEN
CASE
WHEN Field = 'Age' AND Op IN ('=', '>', '>=') AND Unit = 'Year' THEN (@Age/12)
ELSE 0
END
AND
CASE
WHEN Field = 'Age' AND Op IN ('=', '<', '<=') AND Unit = 'Year' THEN (@Age/12)
ELSE 999
END
)
但问题在于这个查询我选择了所有规则,而不仅仅是相关的规则。
如何调整它以将选择限制为仅相关记录?
【问题讨论】:
-
您打算如何输入 3 个月的年龄?由于年龄为
int,因此您不能输入0.25年。年龄是否以月为单位? -
@OlivierJacot-Descombes 我要将条件拆分为 Years 和 Months 另一个(2 个 case 语句)
-
我的意思是,
@Age有什么单位? -
@OlivierJacot-Descombes 只是年份和月份
-
那么
70是什么意思? 70年70个月7年0个月?
标签: sql-server tsql where-clause