2012-02-22 14 views
3

premisisというテーブルを持つSQLデータベースがあります。最高のpremisisnumberの行を選択したいと思います。SELECT MAXが間違った値を返します

これは私が使用しているSQLは次のとおりです。

SELECT max(premisisnr) AS premisisnr FROM premisis 

問題があり、SQL Serverが誤った値を返します!テーブルにはpremisisnumberという行がありますが、上記のSQL文を使用すると、premisisnumberの行が返されます。

なぜですか?また、どのように私はこれを解決するのですか?

+2

テーブルのデータを表示してください。 MAX()は最大値を返します。投稿していないWHERE句がありますか? –

+1

その列はどのような型ですか? – MarcinJuraszek

+6

あなたのカラムのデータ型は 'CHAR'です。それを数値型(整数)に変更します。 –

答えて

14

premisisnrは数値ではなく、むしろcharまたはvarchar値です。 SQL Serverは数値ではなく文字列に基づいてソートされています。だから、キャラクターとして1がキャラクターとして9の前に来るので、10は9の前に来る。

premisisnrフィールドをintまたは数値のいずれかに変更するのが理想的なソリューションです。それはオプションではありません場合は、次の手順を実行できます。

premisisnrは整数値である場合:

select max(cast(premisisnr as int)) as premisisnr from premisis 

premisisnrは小数点値の場合は、精度に小数点としてキャストする必要がありますし、あなたが必要とする規模。

+0

+1列のデータ型を変更できない場合は、where句(特定の数値型では信頼できないISNUMERIC()以外)について言及するのは賢明かもしれません。その列に入ってきたゴミを抜き取ることができます。最初はゴミを防ぐことができるチェック制約があります。 –

+0

非常に有効な点です。私の経験では、時には列が変更できない理由があります。いくつかのアプリケーションがデータ型としてデータバインドされているため、文字ガベージは存在しないかもしれませんが、アプリケーションレイヤーから他の制約が生じることがあります。 – mjsalinger

+0

もちろん、アプリケーションはすべての広告を停止できませんちょっとナンセンスそれは続くかもしれない。私は決してデータから離れた1つの層でも制約を信用することはありません(私は制約/トリガーなどを無効にする許可をユーザーに与えていません)。 –

0

文字データ型(char、nchar、varcharなど)がある可能性があります。

数値フィールドの最大値を正しく取得するには、数値フィールドを使用する必要があります。 int

データ型をintに変更すると、MAX()が機能します。

関連する問題