在nvarchar列中获取最大值

时间:2016-09-26 08:18:19

标签: sql sql-server

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

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

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

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

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

更新

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

7 个答案:

答案 0 :(得分:4)

如果您的数字在给定的示例中填充,并且所有数字都具有相同的宽度,则可以对它们进行排序字母数字,然后再投射 max-value INTBIGINT(取决于您的号码范围)。

如果行数非常多快得多,特别是如果此列上有索引...

这样的东西
SELECT TOP 1 * FROM YourTable
ORDER BY NumberColumn DESC

或者,如果您只需要max-value:

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()
  • 最佳解决方案 - 无论如何 - 是使用索引数字列来存储这些值

答案 1 :(得分:3)

试试这个...

我认为MAX就足够了。

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

答案 2 :(得分:2)

试试这个

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

答案 3 :(得分:2)

您应该尝试找到最高值:

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

答案 4 :(得分:2)

这将返回max int value

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

答案 5 :(得分:2)

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

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

请注意,您不应该使用强制转换,而是使用try_cast来防止无法转换的值(如果使用数据类型存储某些基本上属于另一种数据类型的值,它总是会为错误)。

但是,如果你可以将原始列的类型更改为int,那将是最好的。

答案 6 :(得分:1)

你可以这样使用

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