在字符串比較,「30」小於「8」,因爲它在相同的位置上的單獨的字符進行比較,並3小於8要執行數字比較,您需要使用分隔符函數將文本解析到單獨的字段中,對齊項目然後進行比較。這不會很簡單,並且不可能在任何顯着數量的行上表現良好。
如果您可以通過比較第二個小數點前面的數字,它會更簡單並且性能更好; 30.6 vs 8.23。這些值可以轉換爲十進制並直接進行比較。
--COMPARE JUST THE FIRST TWO
DECLARE @t TABLE (VersionNumber VARCHAR(50));
DECLARE @test VARCHAR(50) = '8.23.2500';
INSERT INTO @t (VersionNumber)
VALUES ('30.6.4.10006'),
('1.2.3.4'),
('100.200.300.400'),
('1.200.3.4'),
('100.2.3.4'),
('8.24.2500'),
('8.23.2501'),
('8.23.2499'),
('8.23');
SELECT t.VersionNumber, @test,
FirstTwo = TRY_CONVERT(decimal(20,2),LEFT(t.VersionNumber, ISNULL(NULLIF(CHARINDEX('.', t.VersionNumber, CHARINDEX('.', t.VersionNumber) + 1), 0) - 1, 8000))),
FirstTwoTest = TRY_CONVERT(decimal(20,2),LEFT(@test, ISNULL(NULLIF(CHARINDEX('.', @test, CHARINDEX('.', @test) + 1), 0) - 1, 8000)))
FROM @t AS t
WHERE TRY_CONVERT(decimal(20,2),LEFT(t.VersionNumber, ISNULL(NULLIF(CHARINDEX('.', t.VersionNumber, CHARINDEX('.', t.VersionNumber) + 1), 0) - 1, 8000)))
> TRY_CONVERT(decimal(20,2),LEFT(@test, ISNULL(NULLIF(CHARINDEX('.', @test, CHARINDEX('.', @test) + 1), 0) - 1, 8000)))
;
驚訝?該值不是整數... – jarlh
你到底想要轉換成什麼? – Siyual
你使用的是MySQL還是MS SQL Server?不要標記不涉及的產品。 – jarlh