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`
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.
sélectionnez ifnull (max (CONVERT (facture_numéro, ENVOI SIGNÉ)), 0) à invoice_header où facture_numéro REGEXP '^ [0-9] + $'
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.
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
Cela devrait fonctionner aussi
SELECT invoice_number
FROM invoice_header
ORDER BY LENGTH( invoice_number) DESC,invoice_number DESC
LIMIT 0,1