2012-10-03 66 views
2

在T-SQL排序我有与具有类型为nvarchar,其具有的值,如的字段“类别”的表的SQL 2008数据库:由字母数字

A1 
A10 
A2 
B1/1 
B1/2 
B1/3 
D1(1) 
D1(2) 

我知道这不是数据的良好结构,但我们现在需要以某种方式缩小搜索范围,以便用户输入开始和结束类别(即A1到A15或B1/1到B/3),并且我们希望仅返回具有这些类别值的记录。

有没有办法可以做到这一点?另一件事是我们也希望结果排序正确(即A2之后的A10)。

c。

+1

是唯一以'A','B'和'D'开始的类别类型,它们的结构总是相同的('A's后面跟着一个数字,'B's后面总是跟着两个数字, /'''D'后面总是跟着两个数字,第二个是内部的'()'括号)?开始和结束类别是否会跨越两种类别(例如'A10 - B1/2')? –

回答

0

您可以使用WHERE子句缩小返回结果的范围。例如:

SELECT Col1 
     ,Col2 
     ... 
     ,Coln 
FROM SourceTable 
WHERE Col1>'A1' AND Col1<'A15' 

您可以使用此值('A1'和'A15')作为用户定义函数的输入参数。那么通过'B1'和'B15'或者其他所有东西都很容易。

另外,如果你想显示后'A10 'A2'

有关用户定义函数的详细信息 - User Defined functions

检查这个information在T-SQL字符串的压缩。你也应该花一些时间在碰撞上 - 比较字符串是否区分大小写或不区分大小写。

至于“另一件事是,我们还要有正确排序(A10 A2后IE)的结果”,你可以在你的函数中添加一些逻辑是这样的:

DECLARE @ParamOne NVARCHAR(2)='A2' 
DECLARE @ParamTwo NVARCHAR(3)='A10' 

SELECT CASE WHEN LEN(@ParamOne)=2 
      THEN CASE WHEN @ParamTwo<STUFF(@ParamOne,2,0,'0') 
        THEN 1 
      ELSE 2 
      END 
     ELSE 
      CASE WHEN @ParamTwo<@ParamOne 
        THEN 1 
      ELSE 2 
      END 
     END