1

「プロセス番号」フィールドを持つデータベースのいくつかのテーブルに一連のレコードがあります。これは基本的に数字ですが、「89a」のようなものを持つレガシーデータのために、文字列として保存する必要があります。番号と、プロセス番号を番号/年で表す必要があるいくつかの番号付けシステム。

プロセスを番号順に並べようとすると、問題が発生します。私は次のようなものを手に入れます:

  • 1
  • 10
  • 11
  • 12

もう 1 つの問題は、新しいプロセスを追加する必要がある場合です。新しいプロセスの番号は、既存の最大の番号に 1 を加えたものにする必要があります。そのためには、既存のレコードを番号順に並べ替える方法が必要です。

助言がありますか?

4

8 に答える 8

1

プロセス番号が固定パターンに従っていないように見える場合 (質問とコメントから)、2 つのフィールドを持つプロセス番号テーブルを作成/維持できますか?

create table process_ordering ( processNumber varchar(N), processOrder int )

次に、テーブルからすべてのプロセス番号を選択し、プロセス番号テーブルに挿入します。(さまざまな) プロセス番号の形式に基づいて、必要に応じて順序を設定します。このテーブルに結合し、processOrder で並べ替え、他のテーブルからすべてのフィールドを選択します。このテーブルを processNumber でインデックス付けして、結合を高速化します。

select my_processes.*
from my_processes
  inner join process_ordering on my_process.processNumber = process_ordering.processNumber
order by process_ordering.processOrder
于 2008-10-16T23:16:09.787 に答える
1

データを 2 つのフィールドに分割できますか?

「プロセス番号」を int として保存し、「プロセス サブタイプ」を文字列として保存します。

その方法:

  • MAX processNumber を簡単に取得でき、新しい番号を生成する必要があるときにインクリメントできます
  • ORDER BY processNumber ASC、processSubtype ASC - 複数のレコードに異なる年/文字が追加された同じベース番号がある場合でも、正しい順序を取得できます
  • 「完全な」数値が必要な場合は、2 つのフィールドを連結するだけです

それはあなたが必要とすることをしますか?

于 2008-10-16T22:41:55.033 に答える
1

多分これが役立つでしょう。

基本的に:

SELECT process_order FROM your_table ORDER BY process_order + 0 ASC
于 2008-10-16T22:29:05.277 に答える
1

数字をゼロパディング値として保存できますか? つまり、01、10、11、12?

于 2008-10-16T22:29:35.980 に答える
1

順序付けのみに使用される新しい数値フィールドを作成し、トリガーから更新することをお勧めします。

于 2008-10-16T22:31:06.163 に答える
1

ここで 2 つのタスクがあるように思えます。

• 従来の形式で文字列を数値に変換する/ジャンクを削除する
• 数値 を並べ替える

文字列解析の正規表現をプロセスに導入する実用的な方法がある場合 (そして、問題に十分なボリュームがあり、努力する価値がある場合)、私は

• 次のような参照テーブルを作成します。


CREATE TABLE tblLegacyFormatRegularExpressionMaster(
    LegacyFormatId int,
    LegacyFormatName varchar(50),
    RegularExpression varchar(max)
)

• 次に、SQL Server 2005 以降での CLR 統合などの正規表現を呼び出す方法を使用します (.NET 共通言語ランタイム統合により、コンパイル済みの .NET メソッドを通常どおり SQL Server 内から呼び出すことができます (Microsoft 拡張) T -SQLの場合、問題を解決できるはずです

        。

          http://www.codeproject.com/KB/string/SqlRegEx.aspx


これが目前の問題に対してオーバーヘッドが大きすぎる場合は、お詫び申し上げます。

于 2008-10-17T05:02:01.460 に答える
1

提案:

• 列を固定幅のテキストにします (つまりCHAR、 ではなくVARCHAR)。

• 既存の値を、各列を埋めるのに十分な数の先行ゼロと、値が 'a' (またはその他) で終わらない末尾のスペースで埋めます。•CHECK制約 (または同等のもの) を追加して、新しい値がパターンに適合するようにします。

CHECK (process_number LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][ab ]')

• 挿入/更新ストアド プロシージャ (または同等のもの) で、入力値をパディングしてパターンに合わせます。

• 人間に値を表示する場合は、必要に応じて先頭/末尾のゼロ/スペースを削除します。

このアプローチのもう 1 つの利点は、着信値 '1'、'01'、'001' などはすべて同じ値と見なされ、DBMS の単純な一意の制約でカバーできることです。

ところで、末尾の「a」(または何でも)を別の列に分割するというアイデアは好きですが、問題のデータ要素は識別子であるため、分割するのは適切ではないという印象を受けました。

于 2008-10-17T07:29:02.490 に答える
0

選択しているときにフィールドをキャストする必要があります。この構文は MySQL に基づいていますが、考え方は同じです。

select * from table order by cast(field AS UNSIGNED);

もちろん、必要に応じて UNSIGNED を SIGNED にすることもできます。

于 2008-10-16T22:39:07.753 に答える