1

クライアント側ソフトウェアのバージョン番号を格納するテーブルがリモート サーバー上にあります。SOAP を使用してリクエストを処理します。クライアント ソフトウェアがバージョン番号を送信するので、SQL を使用して次のバージョン番号を見つける必要があります。

私が使っているSQLはこちらです。私は少し頭が悪い日を過ごしています。これが正しくないことはわかっていますが、何をする必要があるのか​​ わかりません.

テーブル作成コード:

CREATE TABLE IF NOT EXISTS `sqlUpdateVersions` (
  `primary_key` int(11) NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `comment` text NOT NULL,
  `majorVS` tinyint(4) NOT NULL,
  `minorVS` tinyint(4) NOT NULL,
  `revisionVS` tinyint(4) NOT NULL,
  `buildVS` tinyint(4) NOT NULL,
  `filePK` int(11) NOT NULL,
  `customDBJarPK` int(11) DEFAULT NULL,
  PRIMARY KEY (`primary_key`),
  KEY `filePK` (`filePK`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

これは、バージョン番号を見つけるための SQL クエリです。このバージョン 1.1.0.0 にダンプしました

select b.majorVS, b.minorVS,b.revisionVS, b.buildVS
 from sqlUpdateVersions b  where
 b.majorVS>=1 AND b.minorVS >=1 AND b.revisionVS>=0 AND b.buildVS>=10 
 ORDER BY b.majorVS,b.minorVS,b.revisionVS, b.buildVS

これで、この SQL に問題があることがはっきりとわかります。しかし、1.2.0.0 や 1.1.1.0 など、次の値を返すものをどのように構築すればよいでしょうか。

ありがとう。

4

1 に答える 1

2

以下はブルート フォース アプローチです。

select suv.*
from sqlUpdateVersions suv
where suv.majorVS > 1 or
      (suv.MajorVs = 1 and suv.minorVS > 1) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS > 0) or
      (suv.MajorVS = 1 and suv.minorVS = 1 and suv.revisionVS = 0 and suv.buildVS > 10)
order by suv.MajorVS, suv.MinorVS, suv.revisionVS, suv.buildVS

バージョンを bigint に変換して直接比較することもできます。

select suv.*
from (select suv.*,
             buildVS + (cast(1000 as bigint)*revisionVS +
                        (cast(1000 as bigint)*minorVS +
                         (cast(1000 as bigint)*majorVS
                         )
                        )
                       ) as bigVersion 
      from sqlUpdateVersions suv
     ) suv
 where bigversion > 1001000010
于 2013-02-15T16:28:30.543 に答える