我有一个 SQL 2008 数据库,其中的表具有 nvarchar 类型的字段“类别”,其值如下:
A1
A10
A2
B1/1
B1/2
B1/3
D1(1)
D1(2)
等等
我知道这对数据来说不是一个好的结构,但我们现在需要以某种方式缩小对该表的搜索范围,以便用户输入开始和结束类别(即 A1 到 A15,或 B1/1 到 B/3)和我们只想返回具有这些类别值的记录。
有没有办法做到这一点?另一件事是我们还希望对结果进行正确排序(即 A10 在 A2 之后)。
C。
您可以使用 WHERE 子句缩小返回结果的范围。例如:
SELECT Col1
,Col2
...
,Coln
FROM SourceTable
WHERE Col1>'A1' AND Col1<'A15'
您可以将此值(“A1”和“A15”)用作用户定义函数的输入参数。然后很容易通过'B1'和'B15'或其他所有东西而不是它们。
此外,如果您想在“A2”之后显示“A10”
有关用户定义函数的更多信息 -用户定义函数
检查此信息以了解 T-SQL 中的字符串压缩。此外,您应该花一些时间处理冲突——您是比较字符串区分大小写还是不区分大小写。
至于“另一件事是我们还希望对结果进行正确排序(即 A2 之后的 A10)”,您可以在函数中添加一些逻辑,如下所示:
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