0

我有一个 T-SQL 存储过程,它向 .NET 页面上的网格提供大量数据......以至于我在页面顶部选择了“0-9”和每个字母字母表,以便当用户单击字母时,我想根据以该第一个字母开头的结果过滤我的结果。假设我们正在使用产品名称。因此,如果用户单击“A”,我只希望我的存储过程返回 SUBSTRING(ProductName, 1, 1) = “A”的结果。

我被挂断的地方是以数字开头的产品名称。在这种情况下,我想获取 ISNUMERIC(SUBSTRING(ProductName, 1, 1)) = 1 的所有 ProductName 值。我正在使用一个名为 @FL 的输入参数。@FL 要么为零(我们很少有以数字开头的产品,所以我把它们放在一起)。

当然还有 WHERE SUBSTRING(ProductName, 1, 1) IN ('0', '1', '2'.....) 的替代方案,但即便如此,我也无法设计 CASE 语句这将对一个评估执行 = 并为另一个评估执行 IN 语句。

这是我在我的过程中为我的 WHERE 子句的 CASE 部分所拥有的内容。它不起作用,但如果仅从伪代码的角度来看,它可能是有价值的。

提前感谢您的任何想法。

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

4

3 回答 3

1

为什么不只使用 Like 运算符?

   Where dbo.AssnCtrl.Name Like @FL + '%' 

当他们选择任意数字选项时,将@FL 作为“[0-9]”传入

(我假设您对此名称列有索引?)

于 2010-09-10T21:05:43.383 回答
1

从查尔斯那里偷一点东西:

AND Substring(dbo.AssnCtrl.Name, 1, 1) Like
  CASE WHEN @FL = '0' THEN '[0-9]'
    ELSE @FL            
  END
于 2010-09-10T21:14:20.987 回答
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'
于 2010-09-10T21:22:21.917 回答