web-dev-qa-db-fra.com

comment sélectionner le maximum de colonne string/int mixte?

Disons que j'ai une table contenant une colonne pour le numéro de facture, le type de données est VARCHAR avec des valeurs mixtes string/int telles que:

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

J'ai essayé de choisir max, mais il retourne avec "HKL9", pas la valeur la plus élevée "HKL15".

SELECT MAX( invoice_number )
FROM `invoice_header`
12
CairoCoder

HKL9 (chaîne) est supérieur à HKL15, car ils sont comparés en tant que chaînes. Une façon de traiter votre problème consiste à définir une fonction de colonne qui renvoie uniquement la partie numérique du numéro de facture.

Si tous vos numéros de facture commencent par HKL, vous pouvez utiliser:

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

Il prend le numéro de facture excluant les 3 premiers caractères, est converti en entier et sélectionne max.

22
nakosspy

sélectionnez ifnull (max (CONVERT (facture_numéro, ENVOI SIGNÉ)), 0) à invoice_header où facture_numéro REGEXP '^ [0-9] + $'

5
Sandeep

Votre problème est plutôt celui de la définition et du design.

Sélectionnez le numéro de facture avec l'ID ou la DATE le plus élevé, ou - si ces vraiment ne correspondent pas au "numéro de facture le plus élevé" - définissez une colonne supplémentaire assez simple pour que la base de données pauvre comprenne.

select INVOICE_NUMBER 
from INVOICE_HEADER
order by ID desc limit 1;

Ce n'est pas que la base de données n'est pas assez intelligente .. c'est que vous lui posez la mauvaise question.

2
Thomas W

Après un moment de recherche, j'ai trouvé la solution la plus simple.

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

Cela devrait fonctionner aussi

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