我在 IBM Informix 数据库中有一个表,其中有一个数据类型为 CHAR(15) 的列“级别”。如果我对该列执行 SELECT DISTINCT,前 5 个结果是:
- 未知
- 菜鸟
- 1级
- 2A级
- 2B级
我的意图是编写一个查询,该查询将按该列中数字的升序对结果进行排序。我已经通过 VB.NET 代码实现了它,但想知道我是否可以在查询中实现它。
' Results is a generic list of a class with properties corresponding to column names
' I am using IDataReader to go through the queried rows and load the data to 'results'
results = results.OrderBy(Of Integer)(Function(p) Utilities.ExtractNumber(p.Level))
这就是 ExtractNumber 方法的样子:
Public Shared Function ExtractNumber(ByVal expr As String) As Integer
Dim number As Integer = 0
Dim character As Char
Dim startPos As Integer = -1
Dim endPos As Integer = -1
For pos = 0 to expr.Length - 1
character = expr(pos)
If Char.IsDigit(character) And startPos = -1 Then
startPos = pos
Else If Not Char.IsDigit(character) And startPos > -1 Then
endPos = pos
Integer.TryParse(expr.Substring(startPos, endPos - startPos), number)
Exit For
End If
Next
'Number extends till end of string
If startPos > -1 And endPos = -1 Then
Integer.TryParse(expr.Substring(startPos), number)
EndIf
End Function
我的代码所做的是它为该列中的每个值查找字符串中第一次出现的数字。如果字符串中有多个数字(例如 ALPHA 1C 211",它将返回 1,这是第一个数字。如果不存在数字,例如在“未知”中,它将只返回 0。
我上面所做的可以使用 Regex.Split 轻松完成,但我没有使用它,因为它返回一个字符串数组,其中包含数字前的空元素。
有没有办法可以在 SQL 查询中提取这个数字?也许使用某种字符串操作来摆脱除第一个数字之外的所有内容?不过,我不允许编写函数,所以如果可能的话,我必须在一个查询中完成所有这些操作。任何指针?