我有一個SQL數據庫,其表名爲premisis
。我希望選擇最高的premisisnumber
。SELECT MAX返回錯誤的值
這是我使用的SQL:
SELECT max(premisisnr) AS premisisnr FROM premisis
的問題是,SQL Server將返回錯誤的值!在我的表中,我得到了一行premisisnumber
10,但使用上面的SQL語句返回的行數爲premisisnumber
9.
爲什麼?另外,我該如何解決這個問題?
我有一個SQL數據庫,其表名爲premisis
。我希望選擇最高的premisisnumber
。SELECT MAX返回錯誤的值
這是我使用的SQL:
SELECT max(premisisnr) AS premisisnr FROM premisis
的問題是,SQL Server將返回錯誤的值!在我的表中,我得到了一行premisisnumber
10,但使用上面的SQL語句返回的行數爲premisisnumber
9.
爲什麼?另外,我該如何解決這個問題?
這聽起來像premisisnr不是一個數值,而是一個char或varchar值。發生的事情是SQL Server根據字符串而不是數字值進行排序。所以10在9之前,因爲1作爲角色出現在9之前。
理想的解決方案是將premisisnr字段更改爲int或數字值。如果這不是一個選項,你可以做到以下幾點:
如果premisisnr是一個整數值:
select max(cast(premisisnr as int)) as premisisnr from premisis
如果premisisnr是一個十進制值,你必須強制轉換爲十進制的精度和您需要的規模。
+1)我會補充說,如果列數據類型不能改變,可能會謹慎的提到一個where子句(除了對於特定數字類型不可靠的'ISNUMERIC()')以外可以清除進入該列的垃圾導致錯誤,或檢查約束,可以防止垃圾在第一個地方。 – 2012-02-22 16:19:43
非常有效的點。我的經驗是,有時一列不能更改的原因是因爲某些應用程序會將數據綁定爲它的數據類型,所以可能不會有任何字符垃圾,但有時可能會從應用程序層發揮其他約束。 – mjsalinger 2012-02-22 16:21:59
當然,但應用程序無法停止所有廣告胡言亂語那可能會繼續。我永遠不會相信約束,即使距離數據一層(我也不交出允許用戶禁用約束/觸發器等的權限):-)。 – 2012-02-22 16:27:21
看起來你可能有一個字符數據類型(char,nchar,varchar等)。
要正確獲得數字字段的最大值,必須使用數字字段,例如, int
將數據類型更改爲int,MAX()將工作。
請顯示您的表格數據。 MAX()確實返回最大值。你有沒有發佈的WHERE子句? – 2012-02-22 16:08:33
該列聲明的是哪種類型? – MarcinJuraszek 2012-02-22 16:08:41
您的列的數據類型是「CHAR」。將其更改爲數字類型(整數)。 – 2012-02-22 16:09:09