我有一个表,其列的表达式为其值。 我想写一个单选查询来检查该列中的表达式是否保持为真。
这是我的表:
CREATE TABLE #TEMP (FinYear VARCHAR(9), TaxType VARCHAR(50), Rate NUMERIC(10,4), SlabExpression VARCHAR(50))
INSERT INTO #TEMP
VALUES ('2014-2015', 'SURCHARGE', 0.00, '#<=10000000'),
('2014-2015', 'SURCHARGE', 10.00, '#>10000000'),
('2014-2015', 'Education Cess', 3.00, '#<=10000000'),
('2014-2015', 'Education Cess', 3.00, '#>10000000')
SELECT * FROM #TEMP
DROP TABLE #TEMP
我现在的收入价值是1200000,显然属于平板 - &#39;#&gt; 10000000&#39;我打算申请附加费和教育费率。
但是,如何通过单个查询找到正确的平板。
我知道我可以使用Cursor来做到这一点。但是,我不想在这里使用Cursor。 我需要一个单一查询。
注意:此表在一列中有两个SlabExpression值 即。 &#39;#&LT =千万&#39;和&#39;#&gt; 10000000&#39;
我想写一个单独的SELECT查询来获取SlabExpression保持为真的两行。
即。我希望结果为SlabExpression的两行&#39;#&gt; 10000000&#39;
基本上,我想要一个类似
的查询SELECT * FROM #TEMP WHERE SlabExpression Holds True
答案 0 :(得分:0)
FloatingActionButton
答案 1 :(得分:0)
这是解决这个问题的一种方法 在Sql server 2012上经过测试和验证,出于某种原因我似乎无法使它在sql小提琴上工作。 但是,据我所知,我没有使用Sql server 2008上不支持的任何内容。
DECLARE @Value int = 1200000
;WITH CTE AS (
SELECT FinYear,
TaxType,
Rate,
SlabExpression,
@Value As Value1,
REPLACE(LEFT(SlabExpression, PATINDEX('%[0-9]%', SlabExpression)-1), '#', '') As Operator,
CAST(RIGHT(SlabExpression, LEN(SlabExpression)-PATINDEX('%[0-9]%', SlabExpression)+1) As int) As Value2
FROM #TEMP
),
CTE2 AS (
SELECT FinYear,
TaxType,
Rate,
SlabExpression,
CASE Operator
WHEN '<' THEN
CASE WHEN Value1 < Value2 THEN 1 END
WHEN '<=' THEN
CASE WHEN Value1 <= Value2 THEN 1 END
WHEN '>' THEN
CASE WHEN Value1 > Value2 THEN 1 END
WHEN '>=' THEN
CASE WHEN Value1 >= Value2 THEN 1 END
END As IsTrue
FROM CTE
)
SELECT FinYear,
TaxType,
Rate,
SlabExpression
FROM CTE2
WHERE IsTrue = 1
结果:
FinYear TaxType Rate SlabExpression
----------- ---------------------- -------------- --------------
2014-2015 SURCHARGE 0.0000 #<=10000000
2014-2015 Education Cess 3.0000 #<=10000000
说明: 我使用第一个cte将SlabExpression分解为运算符和值, 第二个cte使用该运算符和值来对应变量值。
答案 2 :(得分:-1)
我认为这些SQL对你有用。
SELECT * FROM #TEMP WHERE SlabExpression = '1200000>10000000'
谢谢。