web-dev-qa-db-ja.com

混合文字列/整数列の最大値を選択するにはどうすればよいですか?

請求書番号の列を含むテーブルがあるとします。データ型は次のようなstring/int値が混在するVARCHARです。

invoice_number
**************
    HKL1
    HKL2
    HKL3
    .....
    HKL12
    HKL13
    HKL14
    HKL15

最大値を選択しようとしましたが、「HKL15」ではなく、「HKL9」で戻ります。

SELECT MAX( invoice_number )
FROM `invoice_header`
13
CairoCoder

HKL9(文字列)は、文字列として比較されるため、HKL15より大きくなります。問題に対処する1つの方法は、請求書番号の数値部分のみを返す列関数を定義することです。

すべての請求書番号がHKLで始まる場合は、次を使用できます。

SELECT MAX(CAST(SUBSTRING(invoice_number, 4, length(invoice_number)-3) AS UNSIGNED)) FROM table

最初の3文字を除いたinvoice_numberを受け取り、intに変換して、そこからmaxを選択します。

24
nakosspy
select ifnull(max(CONVERT(invoice_number, SIGNED INTEGER)), 0)
from invoice_header 
where invoice_number REGEXP '^[0-9]+$'
6
Sandeep

あなたの問題はより多くの定義とデザインです。

IDまたは日付が最も大きい請求書番号を選択しますまたは-それらreallyが「最も高い請求書番号と相関しない場合"-追加の列を定義します。これは請求書番号と相関し、貧弱なデータベースが理解するのに十分簡単です。

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

データベースが十分に賢くないということではありません。間違った質問をしているということです。

2
Thomas W

これも機能するはずです

SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC 
LIMIT 0,1
2
irfandar

しばらく検索した後、これに対する最も簡単な解決策を見つけました。

select MAX(CAST(REPLACE(REPLACE(invoice_number , 'HKL', ''), '', '') as int)) from invoice_header
1
Ketan Dubey

以下のクエリを使用できます。

select max(cast((CASE WHEN max_no NOT LIKE '%[^0-9]%' THEN max_no END) as int)) AS max_int_no from table1

0
Ambreen Haleem