これまでのところ、「Operator(600)」までの文字列「Operator(1)」などを含む列があります。
番号順に並べてもらいたいのですが、思いついたのです
select colname from table order by
cast(replace(replace(colname,'Operator (',''),')','') as int)
これは非常に醜いです。
より良い提案?
これまでのところ、「Operator(600)」までの文字列「Operator(1)」などを含む列があります。
番号順に並べてもらいたいのですが、思いついたのです
select colname from table order by
cast(replace(replace(colname,'Operator (',''),')','') as int)
これは非常に醜いです。
より良い提案?
それは、InStr()/SubString()、Operator(1) を Operator(001) に変更する、n を Operator(n) に個別に格納する、または醜い文字列操作を隠す計算列を作成することです。あなたが持っているものは問題ないようです。
データをそのままの形式にしておく必要があり、数値の並べ替え順序の列を追加する方が適切な解決策である場合は、テキスト操作をユーザー定義関数にラップすることを検討して ください。
dbo.udfSortOperator(colname) でテーブル順序から colname を選択
見苦しくなく、ある程度の抽象化が得られます。関数呼び出しの追加のオーバーヘッドがありますが、あまりヒットしないデータベース サーバーに数千行を含むテーブルでは、これは大きな問題ではありません。後で必要に応じて最適化するために、関数にメモを作成します。
まず、その列の意味を定義します。演算子は名前なので、charsを使用して正当化できますか?それとも数字ですか?
フィールドが名前の場合、charsを使用し、固定長を決定する必要があります。左側にすべての演算子名をゼロで埋めます。演算子の命名規則を定義します(IE文字なし。または「A001」のようなシリーズで使用するコード)
インデックスは、サーバー内の物理データを並べ替えます。また、テキストの名前を適切に定義すると、クエリでそれらが並べ替えられます。あなたは両方が欲しいでしょう。
演算子が数値の場合、その列のデータ型が間違っているため、変更する必要があります。
私の答えは、問題を変えることです。可能であれば、operatorNumber フィールドをテーブルに追加します。更新/挿入ルーチンを変更して、番号を抽出して保存します。そうすれば、文字列変換のヒットはレコードごとに 1 回だけになります。
順序付けロジックでは、クエリが実行されるたびに文字列変換が必要になります。
インデックス付きの計算列
列の順序付けやその他の方法で頻繁にクエリを実行していることに気付いたoperator
場合は、その数値の計算列を作成し、その列にインデックスを追加することを検討してください。これにより、計算された/永続的な列が得られます (矛盾しているように聞こえますが、そうではありません)。