SQL Server 2005 に、バージョン番号を並べ替えたい文字列として格納する列があります。この列をソートする方法を見つけることができませんでしたが、ある種のカスタム関数または比較アルゴリズムであると推測しています。
どこから始めればよいか、誰かが私を正しい方向に向けることができますか? 私は間違ったものをグーグルで検索している可能性があります。
乾杯
トリス
SQL Server 2005 に、バージョン番号を並べ替えたい文字列として格納する列があります。この列をソートする方法を見つけることができませんでしたが、ある種のカスタム関数または比較アルゴリズムであると推測しています。
どこから始めればよいか、誰かが私を正しい方向に向けることができますか? 私は間違ったものをグーグルで検索している可能性があります。
乾杯
トリス
個別の int 列 (メジャー バージョンとマイナー バージョンを追跡している場合は MajorCol + MinorCol など) を使用し、次のようなものを実行します。
order by MajorCol, MinorCol
私のクエリで。
文字列を int または文字列、またはネイティブ SQL Server ソートでのソートに適したものに処理する、永続化された計算列の使用を検討します。
'1.1.1.1' -> '001.001.001.001'
'10.10.10.10' -> '010.010.010.010'
'1.10.1.10' -> '001.010.001.010'
計算された列で並べ替えて、期待される結果を得ることができるようにします。
または、このような操作をインラインで使用できますが、非常に遅くなる可能性があります。さらに、スカラー UDF は非常に低速です。
SQL CLR 関数を作成する方法です。それらは非常に高速で強力です。既存のコードを変更する必要がなく、必要なすべての情報を SQL ステートメントで直接指定できるため、迅速かつ効果的です。
SQL CLR 関数は、入力文字列と、入力文字列から抽出する情報を指定するその他のパラメーターを受け入れることができます。次に、関数の戻り値で並べ替えることができます。
具体的には、入力文字列、正規表現、およびグループ名の 3 つのパラメーターを受け取る汎用関数を作成します。この関数を使用すると、データベース フィールドと名前付きグループを含む正規表現を SQL ステートメントで直接渡すことができます。
SQL CLR 関数は Regex を作成し、それを文字列に対してテストし、最終的に一致したグループの値を返すか、一致がない場合、またはグループが一致しなかった場合 (グループがオプションの場合) は null を返します。理想的には、コンパイルされた正規表現の CLR キャッシュを利用するために、同じ正規表現を各呼び出しに (おそらく @regex のような変数として) 渡したいと思うでしょう。最終結果は非常に柔軟で高速になります。
正規表現オプションは、「(?imnsx-imnsx:subexpression)」のようなパターンでインラインで指定できます。参照: msdn.microsoft.com/en-us/library/yd1hzczs.aspx
このような関数のコードは次のようになります。
[SqlFunction(IsDeterministic=true,IsPrecise=true,DataAccess=DataAccessKind.None,SystemDataAccess=SystemDataAccessKind.None)]
public static SqlString RegexMatchNamedGroup( SqlChars input, SqlString pattern, SqlString group_name )
{
Regex regex = new Regex( pattern.Value );
Match match = regex.Match( new string( input.Value ) );
if (!match.Success) //return null if match failed
return SqlString.Null;
if (group_name.IsNull) //return entire string if matched when no group name is specified
return match.Value;
Group group = match.Groups[group_name.Value];
if (group.Success)
return group.Value; //return matched group value
else
return SqlString.Null; //return null if named group was not matched
}
SQL ステートメントは、次のように情報の一部を並べ替えることができます。
declare @regex nvarchar(2000) = '^(?<Major>\d{1,3})\.(?<Minor>\d{1,3})';
select VersionNumber
from YourTable
order by
Cast(RegexMatchNamedGroup( VersionNumber, @regex, 'Major') as int),
Cast(RegexMatchNamedGroup( VersionNumber, @regex, 'Minor') as int)