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 が返されます。"unknown" のように数字が存在しない場合は、0 が返されます。
上記で行ったことは、たとえば Regex.Split を使用して簡単に実行できますが、数値の前に空の要素を持つ文字列配列を返すため、これは使用しませんでした。
SQL クエリでこの数値抽出を行う方法はありますか? 何らかの文字列操作を使用して、最初の数字以外のすべてを削除することはできますか? ただし、関数を作成することは許可されていないため、可能であれば、これらすべてを 1 つのクエリで実行する必要があります。ポインタはありますか?