請求書番号の列を含むテーブルがあるとします。データ型は次のようなstring/int値が混在するVARCHARです。
invoice_number
**************
HKL1
HKL2
HKL3
.....
HKL12
HKL13
HKL14
HKL15
最大値を選択しようとしましたが、「HKL15」ではなく、「HKL9」で戻ります。
SELECT MAX( invoice_number )
FROM `invoice_header`
HKL9
(文字列)は、文字列として比較されるため、HKL15
より大きくなります。問題に対処する1つの方法は、請求書番号の数値部分のみを返す列関数を定義することです。
すべての請求書番号がHKL
で始まる場合は、次を使用できます。
SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table
最初の3文字を除いたinvoice_numberを受け取り、intに変換して、そこからmaxを選択します。
select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header
where invoice_number REGEXP '^[0-9]+$'
あなたの問題はより多くの定義とデザインです。
IDまたは日付が最も大きい請求書番号を選択しますまたは-それらreallyが「最も高い請求書番号と相関しない場合"-追加の列を定義します。これは請求書番号と相関し、貧弱なデータベースが理解するのに十分簡単です。
select INVOICE_NUMBER
from INVOICE_HEADER
order by ID desc limit 1;
データベースが十分に賢くないということではありません。間違った質問をしているということです。
これも機能するはずです
SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC
LIMIT 0,1
しばらく検索した後、これに対する最も簡単な解決策を見つけました。
select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
以下のクエリを使用できます。
select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1