【问题标题】:SQL Server compare numbers after decimal pointSQL Server 比较小数点后的数字
【发布时间】:2019-12-13 05:17:31
【问题描述】:

我们在 SQL Server 数据库中有一些数值,例如 7.11 and 7.6。 其实7.11 is later version than 7.6,在SQL server中使用“max(vernum)”时,会返回7.6。我们怎样才能让 SQL Server 返回7.11? 谢谢

【问题讨论】:

标签: sql-server


【解决方案1】:

你应该去阅读official docs

默认情况下,SQL Server 在将数字转换为 精度和小数位数较低的小数或数值

试试这个

SELECT MAX(Version) OVER(ORDER BY CAST(PARSENAME(version, 2) AS INT) DESC,CAST(PARSENAME(version, 1) AS INT) DESC) Version, Version    
FROM yourTable

FIDDLE DEMO

【讨论】:

    【解决方案2】:

    在我的脑海中,您可以在这里使用TOP 查询,通过将主要和次要版本号转换为整数来使用排序:

    SELECT TOP 1 version
    FROM yourTable
    ORDER BY
        CAST(LEFT(version, CHARINDEX('.', version) - 1) AS INT) DESC,
        CAST(SUBSTRING(version, CHARINDEX('.', version) + 1, LEN(version)) AS INT) DESC;
    

    Demo

    【讨论】:

      【解决方案3】:

      我会给你一个更简短的答案。

      with cte as (
          select  7.11 as ver
          union all
          select 7.6
      )select top 1 ver from cte
            order by parsename(ver, 2), parsename(cast(ver as float), 1)
      

      【讨论】:

        【解决方案4】:

        你可以试试这个。

        CREATE TABLE #Numbers (value float);
        INSERT INTO #Numbers (value)
        VALUES (7.1);
        INSERT INTO #Numbers (value)
        VALUES (7.6);
        INSERT INTO #Numbers (value)
        VALUES (7.11);
        INSERT INTO #Numbers (value)
        VALUES (1.1);
        INSERT INTO #Numbers (value)
        VALUES (6.5);
        
        SELECT Top 1 VALUE , Cast(PARSENAME(VALUE,1) as Int) AS DECIMAL_ONLY 
        FROM #NUMBERS
        order by 2 desc
        

        【讨论】:

          猜你喜欢
          • 2020-12-03
          • 2013-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-08
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多