2016-09-26 154 views
-2

我正在使用SQL Server 2012 SP2开发数据库。在nvarchar列中获取最大值

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

我需要在此列,以获得最大的价值,并将其转换为INT。我该怎么做?

我发现,我可以转换为nvarchar这个SQL语句来诠释:
SELECT CAST(YourVarcharCol AS INT) FROM Table

但我不知道我怎样才能在该列中的最大值,因为数字是nvarchar的。

UPDATE:

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

+1

选择顶部1 CAST(YourVarcharCol AS INT)作为IVAL从表顺序由IVAL递减 – jarlh

+0

使用 – Bharat

+0

在任何情况下,这种 '从表名 选择MAX(CAST(AS的ColumnName INT))',这很有趣,知道你最终的目标是什么,以及为什么你需要计算数字串的最大值,因为可能有更好的解决方案。 –

回答

3

如果您号码在给出的例子填充等,都具有相同的宽度,你可以排序他们字母数字再投的最大价值INTBIGINT(取决于您的号码范围)。

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

喜欢的东西

SELECT TOP 1 * FROM YourTable 
ORDER BY NumberColumn DESC 

,或者,如果你需要的MAX-只值:

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()
  • 最好的解决方案 - 在任何情况下 - 是使用索引数字列来存储这些值
+0

谢谢。是的,这些数字将以相同的宽度填充。而且,不,这不会是负数。从第二秒开始的第二秒可能会变得很慢? – VansFannel

+0

@VansFannel,第一种方法是依赖字母数字排序(无负数,全部填充到相同的宽度)。把这个栏放在索引上,这将会闪电般快。第二种方法是对每个值(或TRY_CAST())执行“CAST”操作,这将导致全表扫描,并且速度非常慢。 – Shnugo

1

试试这个

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

您可以使用这样

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

试试这个...

我认为MAX就够了。

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

你应该试试这个在寻找最高值:

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

这将返回max int value

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

如果所有的数据都遵循相同的填充和格式设置模式,简单的最大值(col)会做。

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

请注意,您不应该使用强制类型转换,而是使用try_cast来防止无法强制转换的值(如果使用数据类型来存储某种本质上是另一种数据类型的值,则会导致出错的可能性)。

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