2016-09-26 210 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,那麼它是最好的。