2013-05-11 16 views
7

Diciamo che ho una tabella che contiene una colonna per numero di fattura, il tipo di dati è VARCHAR con i valori di stringa/int misti come:come selezionare il massimo della colonna mista stringa/int?

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

ho cercato di selezionare massimo di esso, ma si ritorna con " HKL9 ", non il valore più alto" HKL15 ".

SELECT MAX(invoice_number) 
FROM `invoice_header` 

risposta

16

HKL9 (stringa) è maggiore di HKL15, perché sono confrontati come stringhe. Un modo per affrontare il problema è definire una funzione di colonna che restituisca solo la parte numerica del numero di fattura.

Se tutti i numeri di fattura iniziano con HKL, allora si può usare:

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

Si prende l'INVOICE_NUMBER escludendo i primi 3 caratteri, converte a int, e seleziona max da esso.

+0

Grazie a @nakosspy, ma come posso farlo utilizzando php/mysql? – CairoCoder

+0

L'istruzione è SQL standard. Puoi eseguirlo come qualsiasi altra affermazione. – nakosspy

+0

Ho capito, è: SELECT max (sottostringa (numero fattura, 4, lunghezza (numero fattura) -3)) FROM tabella – CairoCoder

2

Il tuo problema è più uno di definizione & design.

Selezionare il numero della fattura con la massima ID o DATE, o - se coloro davvero non si correlano con il "più alto numero di fattura" - definire una colonna aggiuntiva, che fa mettere in relazione con la fattura numero ed è abbastanza semplice da capire per il povero database.

select INVOICE_NUMBER 
from INVOICE_HEADER 
order by ID desc limit 1; 

Non è che il database non sia abbastanza intelligente .. è che stai facendo la domanda sbagliata.

+0

Grazie a @ Thomas W, ma come dovrei chiederlo, se sto chiedendo nel modo sbagliato? – CairoCoder

+1

Penso anche che sia ordine per desc. – CairoCoder

+0

La fattura con il numero più alto dovrebbe essere la più recente; per ID o per data. Non dovresti aspettarti che i database decodificino le stringhe arbitrarie, ma sono molto veloci a fare scansioni di indici a chiave primaria :) –

4

selezionare IFNULL (max (CONVERT (INVOICE_NUMBER, intero con segno)), 0) dal invoice_header dove INVOICE_NUMBER REGEXP '^ [0-9] + $'

+0

Questa è l'unica risposta corretta qui perché funziona anche se i numeri di fattura hanno formati diversi e funziona senza modificare il database. – Vincent

1

Questo dovrebbe funzionare anche

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

Dopo un po 'di ricerca ho trovato la soluzione più semplice a questo.

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