【发布时间】:2011-04-10 22:31:42
【问题描述】:
我有一个 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 语句会产生相同的结果('=' 附近的错误)。
【问题讨论】:
-
内部 CASE 是多余的 - ISNUMBERIC 将始终被执行,因为 @FL 已经被测试为“0”
标签: sql tsql case substring isnumeric