我有一个T-SQL存储过程,它为.NET页面上的网格提供了大量数据....以至于我把选项放在页面顶部的“0-9”和字母表中的每个字母,以便当用户点击该字母时,我想根据以该第一个字母开头的结果过滤我的结果。假设我们正在使用产品名称。因此,如果用户点击“A”,我只希望我的存储过程返回SUBSTRING(ProductName,1,1)=“A”的结果。
我挂断的地方是以数字开头的产品名称。在这种情况下,我想获取所有ProductName值,其中ISNUMERIC(SUBSTRING(ProductName,1,1))= 1.我正在使用一个名为@FL的输入参数。 @FL将是零(我们很少有以数字开头的产品,所以我把这些产品整合在一起)。
当然还有替代WHERE SUBSTRING(ProductName,1,1)IN('0','1','2'.....)但即便如此,我也无法设计一个CASE语句,它将在一个评估中执行=,在另一个评估中执行IN语句。
这是我在我的WHERE子句的CASE部分的proc中所拥有的。它不起作用,但如果仅从伪代码的角度来看它可能是有价值的。
提前感谢您提出的任何想法。
AND CASE @FL
WHEN "0" THEN
CASE WHEN @FL = "0" THEN
isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
ELSE
SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL
END
END
***我知道CASE声明的这种使用是“非标准的”,但我在网上发现它并认为它有一些承诺。但尝试使用单个CASE语句产生相同的结果('='附近的错误)。
答案 0 :(得分:1)
为什么不使用Like运算符?
Where dbo.AssnCtrl.Name Like @FL + '%'
当他们选择Any Number选项时,将@FL作为'[0-9]'
传递(我假设你在这个名字栏上有一个索引?)
答案 1 :(得分:1)
从查尔斯偷了一下:
AND Substring(dbo.AssnCtrl.Name, 1, 1) Like
CASE WHEN @FL = '0' THEN '[0-9]'
ELSE @FL
END
答案 2 :(得分:0)
你试过吗
AND (
isnumeric(substring(dbo.AssnCtrl.Name, 1, 1)) = 1
or
SUBSTRING(dbo.AssnCtrl.Name, 1, 1) = @FL )
这对我有用:
select * from casefile where
isnumeric(substring(pmin,1,1)) = 1
or
substring(pmin,1,1) = 'a'