【问题标题】:Get the greatest value in a nvarchar column获取 nvarchar 列中的最大值
【发布时间】:2016-09-26 16:46:15
【问题描述】:

我正在使用 SQL Server 2012 SP2 开发数据库。

我有一个包含 NVARCHAR(20) 列的表,其中包含数字:“000001”、“000002”等。

我需要在该列中获取最大值并将其转换为 int。我该怎么做?

我发现我可以用这个 sql 语句将 nvarchar 转换为 int:
SELECT CAST(YourVarcharCol AS INT) FROM Table

但我不知道如何获得该列中的最大值,因为数字是 nvarchar。

更新:

顺便说一下,这个列是 NVARCHAR,因为我需要在上面存储文本。我正在测试我的解决方案,我需要存储 ONLY 个数字来测试它。

【问题讨论】:

  • SELECT top 1 CAST(YourVarcharCol AS INT) as ival FROM Table order by ival desc
  • 使用这个'select max(cast(ColumnName AS INT))from TableName'
  • 无论如何,了解您的最终目标是什么以及为什么需要计算数字字符串的最大值会很有趣,因为可能会有更好的解决方案。
  • 有什么理由将数值作为文本存储在数据库中?你支持非数字值吗?请注意,可能不会使用此列上的索引,因为字母数字顺序可能与数字顺序不对应,这意味着您的代码可能会对此类查询进行全表扫描,因为此列是文本。您确定这是正确的解决方案吗?
  • 如果您目前正在开发新的解决方案,我会强烈建议您将该列的数据类型更改为数字,并保留格式以处理添加此零按需提供。

标签: sql sql-server


【解决方案1】:

如果您的数字像给出的示例一样被填充并且都具有相同的宽度,您可以将它们按字母数字顺序排序,然后投射最大值INTBIGINT(取决于你的号码范围)。

如果有很多行,它要快得多,尤其是如果此列上有索引...

有点像

SELECT TOP 1 * FROM YourTable
ORDER BY NumberColumn DESC

或者,如果您只需要最大值:

SELECT MAX(NumberColumn) FROM YourTable

如果您必须处理负数不同填充的数字,您必须先转换它们

SELECT TOP 1 * FROM YourTable
ORDER BY CAST(NumberColumn AS INT) DESC

SELECT MAX(CAST(NumberColumn AS INT)) FROM YourTable

请注意:

  • 如果您有很多行,第二个可能会变得相当慢。阅读关于sargable
  • 如果您的 NumberColumn 可能包含无效值,您必须检查,阅读关于ISNUMERIC()
  • 最佳解决方案——无论如何——是使用索引数字列来存储这些值

【讨论】:

  • 谢谢。是的,数字将以相同的宽度填充。而且,不,不会是负数。秒从秒可能会变得相当慢?
  • @VansFannel,第一种方法是依靠字母数字排序(没有负数,都填充到相同的宽度)。在此列上放置和索引,这将是闪电般的速度。第二种方法是在每个单个值(或TRY_CAST())上添加一个CAST,这将导致全表扫描并且会非常慢...
【解决方案2】:

试试这个...

我觉得MAX 就够了。

SELECT max(CAST(YourVarcharCol AS INT)) FROM Table

【讨论】:

    【解决方案3】:

    试试这个

    SELECT MAX(t.Y) from (SELECT CAST(YourVarcharCol AS INT) as Y FROM Table) t
    

    【讨论】:

      【解决方案4】:

      你应该尝试这个找到最高值:

      SELECT MAX(CAST(YourVarcharCol AS INT)) AS FROM Table
      

      【讨论】:

        【解决方案5】:

        如果所有数据都遵循相同的填充和格式化模式,一个简单的 max(col) 就可以了。

        但是,如果不是,您必须先将值转换为 int。搜索转换为其他数据类型的列不会使用索引(如果有的话),而是会扫描整个表。它可能适合您,也可能不适合您,具体取决于表中的要求和行数。如果您需要性能,则创建一个计算列作为 try_cast( col as int),并在其上创建索引。

        请注意,您不应该使用强制转换,而是使用 try_cast 来防止无法强制转换的值(如果您使用数据类型来存储本质上属于另一种数据类型的内容,它总是会带来错误的可能性) .

        当然,如果你能把原始列的类型改成int,那就最好了。

        【讨论】:

          【解决方案6】:

          这将返回max int value

          SELECT MAX(IIF(ISNUMERIC(YourVarcharCol) = 1, YourVarcharCol, '0') * 1) FROM Table
          

          【讨论】:

            【解决方案7】:

            你可以这样使用

            select  max(cast(ColumnName AS INT ))from TableName
            

            【讨论】:

              猜你喜欢
              • 2019-10-23
              • 1970-01-01
              • 2014-12-21
              • 1970-01-01
              • 2010-11-23
              • 2020-09-22
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多