我有一个SQL表,它存储管理层插入的值。我正在尝试在Select语句中使用操作数值。管理层可以设置null、=、>=的值或<=在表格中。
--获取LifeCycle D 的值
DECLARE @LowerCYSaleValD Int
DECLARE @UpperCYSaleValD Int
DECLARE @LowerOperandValD VARCHAR(50)
DECLARE @UpperOperandValD VARCHAR(50)
正在设置的值:
SET @LowerCYSaleValD = (SELECT LowerCYSaleVal FROM #LifeCycleFormulas WHERE LifeCycleAssigned = 'D')
SET @UpperCYSaleValD = (SELECT UpperCYSaleVal FROM #LifeCycleFormulas WHERE LifeCycleAssigned = 'D')
SET @LowerOperandValD = (SELECT LowerOperandVal FROM #LifeCycleFormulas WHERE LifeCycleAssigned = 'D')
SET @UpperOperandValD = (SELECT UpperOperandVal FROM #LifeCycleFormulas WHERE LifeCycleAssigned = 'D')
返回的值:
@LowerCYSaleValD = 50
@UpperCYSaleValD = 149
@LowerOperandValD = >=
@UpperOperandValD = <=
在我的案例陈述中,这是有效的:
WHEN h.Sales >= 50 AND h.sales <=149 THEN 'D'
这项工作:
WHEN h.Sales >= @LowerCYSaleValD AND <= @UpperCYSaleValD THEN 'D'
我需要将其转换为:
WHEN h.Sales @LowerOperandValD @LowerCYSaleValD AND @UpperOperandValD @UpperCYSaleValD THEN 'D'
您还没有具体指定要使用的RDBMS平台,但我敢肯定,没有任何平台允许变量直接在SQL语句中取代运算符/s。
老实说,可能有很多方法可以剥这只谚语中的猫的皮,但如果可能的话;运算符";值仅>=<=和=,则相对简单的方法是:
CASE
WHEN
(
(Sales >= @var1 AND @operator1 = '>=')
OR
(Sales <= @var1 AND @operator1 = '<=')
OR
(Sales = @var1 AND @operator1 = '=')
)
AND
(
(Sales >= @var2 AND @operator2 = '>=')
OR
(Sales <= @var2 AND @operator2 = '<=')
OR
(Sales = @var2 AND @operator2 = '=')
)
THEN 'D'
ELSE 'something else'
END
当然,如果用户可以选择的不同类型的运算符可能会随着时间的推移而更改/增加,那么CASE语句将不得不更改。您可以潜在地将CASE语句封装在标量值函数中(同样,取决于您正在使用的特定RDBMS(,这样,如果您需要在多个不同的查询中引用它,那么它只是传递两个";值";变量和两个";运算符";变量,并获取返回值。