在 Access 中,若已將版本號(如1.3.15
)轉換為整數形式(如10315
,即1*10000 + 3*100 + 15
),可以通過 SQL 的數學運算反向解析出原始版本號格式(主版本.次版本.修訂號
)。
實現思路
通過除法和取余運算拆分整數:
- 主版本號:整數除以
10000
的商(整數部分) - 次版本號:整數除以
10000
的余數,再除以100
的商 - 修訂號:整數除以
100
的余數
SQL 查詢示例
假設表名為SoftwareVersions
,存儲整數版本號的字段為NumericVersion
,則查詢語句如下:
SELECT NumericVersion,-- 主版本號:除以10000取整數部分Int(NumericVersion / 10000) AS Major,-- 次版本號:先取除以10000的余數,再除以100取整數部分Int((NumericVersion Mod 10000) / 100) AS Minor,-- 修訂號:取除以100的余數NumericVersion Mod 100 AS Patch,-- 拼接為原始版本號格式(如1.3.15)Int(NumericVersion / 10000) & "." & Int((NumericVersion Mod 10000) / 100) & "." & (NumericVersion Mod 100) AS VersionText
FROM SoftwareVersions;
說明
運算邏輯:
Int(NumericVersion / 10000)
:提取主版本(如10315 / 10000 = 1.0315
,取整數得1
)NumericVersion Mod 10000
:先獲取10315 - 1*10000 = 315
,再除以100
取整數得3
(次版本)NumericVersion Mod 100
:直接獲取10315
除以100
的余數15
(修訂號)
拼接格式:
- 使用
&
符號連接字符串(Access 中字符串拼接運算符為&
,而非 SQL Server 的+
) - 最終得到
1.3.15
格式的版本號文本
- 使用
適用范圍:
- 僅適用于按
主版本*10000 + 次版本*100 + 修訂號
規則轉換的整數版本號 - 若版本號規則變更(如基數調整為 1000),需同步修改除數(如
1000000
、1000
等)
- 僅適用于按
通過上述 SQL,可直接從整數形式反向解析出易讀的版本號格式,方便查詢和展示。
進階方案:拆分字段法(多 INT 字段)
1. 實現邏輯
將版本號拆分為主、次、修訂號字段,直接按數值排序:
CREATE TABLE SoftwareVersions (Id INT PRIMARY KEY,Major INT NOT NULL,Minor INT NOT NULL,Patch INT NOT NULL,INDEX IX_Version NONCLUSTERED (Major, Minor, Patch)
);
2. 插入與排序示例sql
-- 插入數據
INSERT INTO SoftwareVersions (Major, Minor, Patch)
VALUES (1, 3, 5),(1, 3, 51);-- 按版本號升序查詢
SELECT CONCAT(Major, '.', Minor, '.', Patch) AS Version
FROM SoftwareVersions
ORDER BY Major, Minor, Patch;
-- 結果:1.3.5 → 1.3.51
3. 優點與注意事項
- 優點:排序最準確,適合復雜版本號(如包含預發布標識)。
- 注意事項:增加表字段數量,需維護字段間一致性。
數值轉換法(INT/BIGINT 存儲)
1. 實現邏輯
將版本號各部分乘以基數的冪次后相加:
-- 公式:major * 1000000 + minor * 1000 + patch
DECLARE @version NVARCHAR(20) = '1.3.51';
SELECT CAST(PARSENAME(@version, 3) AS INT) * 1000000 +CAST(PARSENAME(@version, 2) AS INT) * 1000 +CAST(PARSENAME(@version, 1) AS INT) AS NumericVersion;
-- 輸出:10351
2. 表結構設計
CREATE TABLE SoftwareVersions (Id INT PRIMARY KEY,Version NVARCHAR(20) NOT NULL,NumericVersion INT NOT NULL, -- 存儲轉換后的數值INDEX IX_NumericVersion NONCLUSTERED (NumericVersion)
);
插入與排序示例sql
-- 插入數據
INSERT INTO SoftwareVersions (Version, NumericVersion)
VALUES ('1.3.5', 10305),('1.3.51', 10351);-- 按版本號升序查詢
SELECT Version
FROM SoftwareVersions
ORDER BY NumericVersion;
-- 結果:1.3.5 → 1.3.51