web-dev-qa-db-ja.com

varchar列のMAX

priceという名前の列がvarcharと入力されたテーブルがあります。この列の最大値が必要です。私はこのクエリを使用しています:

SELECT MAX(price) FROM product_management.`item_list` 

しかし、結果は間違っています。この問題を解決してください。

[SB] SQLyog Ultimate Ver。を使用しています。 9.0.2.0。

3
ashish

varcharと入力されたpriceという名前の列を持つテーブルがあります。

そして問題があります。明らかに数値がある列があり(名前priceが関連すると仮定)、char型を選択しました。


この列の最大値が必要です。私はこのクエリを使用しています:

_SELECT MAX(price) FROM product_management.`item_list` ;
_

しかし、結果は間違っています。

結果は100%正しいですが、期待したとおりではありません。データベースはあなたが要求したとおりのことを行いましたが、あなたが求めていたものではありませんでした。

varchar列のMAX()を要求したところ、それが得られました。問題は、char列の場合、順序付けが行われることです辞書順-辞書のように-番号順ではありません。 char型の列には、数値ではなくchar値(文字列)があるためです。

したがって、データベースの場合、これらは単なる文字列です。そこに_peters-sellers_の値を含めることができます。 char列の値の順序は、すべての値が視覚的に「数値」であっても、次のようになります。

_1
11
165
17
2
20
200
21
21789
3
35
350
9
99
997
_

そしてもちろん、クエリは辞書式の最大値(_997_)を返し、数値の最大値(_21789_)を返しません。


最善の解決策は、列を数値型に変換することです-integerdecimal、期待する値に応じて-そしてMAX()MIN()および_ORDER BY_は期待どおりに機能します。

タイプを変更できない場合(MAX/MIN関数を適用する前に値を数値タイプにキャストすること)は回避策がありますが、お勧めしません。これにより、列に意味のないデータを格納することが可能になり、変換エラーが発生する可能性があります(どの番号を_'peter-sellers'_に変換する必要がありますか?)

6
ypercubeᵀᴹ

Convert関数を使用できます。詳細については、

https://dev.mysql.com/doc/refman/8.0/en/cast-functions.html#function_convert

例:

SELECT max(Convert(`price`, SIGNED)) FROM product_management.`item_list`;
0
Shubham Malik