使用子字符串和isnumeric的T-SQL Case语句

时间:2010-09-10 20:58:14

标签: sql tsql case substring isnumeric

我有一个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语句产生相同的结果('='附近的错误)。

3 个答案:

答案 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'