3

作成中の MS SQL クエリがあり、特定のレコードがバージョン番号に基づいて「新しい」または「古い」カテゴリに分類されるかどうかを判断する必要があります。

「VersionNum」列があり、古いバージョンは 2.75.99.99 以下の任意のバージョン番号であり、新しいバージョンは 2.76.00.00 以降の任意のバージョン番号です。列のデータ型は varchar(20) です。

X.XX から文字列のサブセットを取得し、これを 10 進数としてキャストすることを考えていました。次に、すべてのバージョンが X.XX 10 進数にキャストされると、select 内の case ステートメントで > または < を実行することで、古いか新しいかを判別できます。

これは、バージョン番号がどこにあるかを決定するための正しい方法またはアイデアでしょうか? それとも何か他の方法がありますか。私が尋ねるのは、これに似たものが他の場所で必要になると想像するからであり、これは特別な状況ではありません.

編集: 1 つの追加の問題。X.XX.XX.XX (2.76.00.00) ではないバージョンもあれば、8.00.00 の形式のものもあり、「古い」バージョンと見なされます。これは、私がかつて考えていたよりもはるかにシステムを混乱させます。5 桁のバージョン (8.00.00) は常に古いと見なされるという情報を入手しました。したがって、5 桁の場合は常にバージョンが古いことになります。したがって、次のようなケースステートメントを実行すると考えています。

SELECT
    Old = CASE WHEN LEN(VersionNum) < 10 THEN 1
               WHEN CAST(SUBSTRING(VersionNum,1,4) AS DECIMAL(5,2)) < 1.52
                    AND LEN(VersionNum) >= 10 THEN 1
               ELSE 0
          END,
    New = CASE WHEN CAST(SUBSTRING(VersionNum,1,4) AS DECIMAL(5,3)) >= 1.52
                    AND LEN(VersionNum) >= 10 THEN 1
               ELSE 0
          END
FROM
    VersionTable

私の論理は正しいですか?それとも私は何かを逃していますか。長さの不平等は非常に厄介です。

4

3 に答える 3

5

このような「数値」は、常に 4 つの部分しかないと仮定して、いつでも整数として表すことができます。

DECLARE @x VARCHAR(20);

SELECT @x = '2.76.99.99';

SELECT 
 v = PARSENAME(@x, 4) * 1000000
   + PARSENAME(@x, 3) * 10000
   + PARSENAME(@x, 2) * 100
   + PARSENAME(@x, 1);

結果:

2769999

したがって、ビューまたは計算列を作成すると、複雑な解析/変換を試みる代わりに、単純な数学を使用して比較できます。

コメントに基づいて編集

テーブルに 3 オクテットしかない値がある場合、それを修正してみませんか?

UPDATE dbo.table SET col = col + '.00'
  WHERE LEN(x) < 10;

より正確にしたい場合:

UPDATE dbo.table SET col = LTRIM(RTRIM(col)) + '.00'
  WHERE LEN(LTRIM(RTRTIM(x))) - LEN(REPLACE(LTRIM(RTRIM(x)), '.', '')) = 3;
于 2012-05-01T19:35:23.747 に答える
1

これに対する実際の修正は、必要な範囲に応じて、バージョン番号を一連のsmallintint、またはフィールドに分割することです。bigintこれができない場合は、ルックアップ テーブルを作成することもできますが、これは非常に厄介な解決策です。

持っていた場合は、次のように言います。

CREATE TABLE Versions
(MajorVersion int,
 MinorVersion int,
 Subversion int,
 Build int)

次に、必要に応じて個々のフィールドを比較できます。

于 2012-05-01T19:35:11.433 に答える
0

バージョン文字列の数字の左側がゼロで埋められている場合は、文字列比較: "2.75.99.99" < "2.76.00.00" を使用できます。

これは、フォーマットがすべてのバージョンで一貫していると仮定して機能します。

于 2012-05-01T19:50:51.767 に答える