2011-02-04 11 views
23

Ho un database SQLite che dovrà contenere prodotti. Questi prodotti hanno un numero di prodotto composito in formato fisso, costituito da categoria, gruppo e numero di prodotto (cccccc.gg.ppp). Ogni volta che viene inserito un nuovo prodotto, il nuovo numero di prodotto deve essere creato utilizzando i numeri di categoria e di gruppo, seguito dal numero di prodotto più alto in quel gruppo incrementato con uno.Funzione SQLite per formattare numeri con zeri iniziali?

A tal fine, stavo pensando di memorizzare tutti e tre i numeri in campi separati e utilizzare una vista per assemblare dinamicamente il numero del prodotto. Perché funzioni, dovrei aggiungere degli zeri iniziali, poiché il formato del numero del prodotto è fisso.

Tuttavia, non riesco a trovare una funzione incorporata di SQLite che mi permetta di fare questo ... :-(

preferirei non scrivere una funzione personalizzata, dal momento che potremmo avere a condividere il database con altri sviluppatori, perché possano leggere i dati, e non ho idea di quale piattaforma o lingua utilizzeranno

Può essere fatto? O dovremo trovare una soluzione diversa?

risposta

48

Questa operazione può essere eseguita con un po 'di magia utilizzando la concatenazione di stringhe e la funzione substr. Per farla breve, ecco cosa vuoi:

select substr('0000000000'||'1234', -10, 10) 

Una spiegazione segue.

In primo luogo, sapere che l'operatore di concatenazione di stringhe di SQLite è ||.

Inizieremo prendendo una stringa lunga quanto il valore che vogliamo restituire. Ad esempio, se si desidera restituire un numero di 10 caratteri e lasciarlo riempito con 0 se è più corto, iniziare con una stringa di dieci 0 s. A tal fine, concateneremo il numero che desideri restituire. Nel nostro esempio, è "1234". Finora, abbiamo la parte che assomiglia a questa: '0000000000'||'1234'

Quindi, passare l'intera cosa nella funzione substr. According to the documentation, ecco come funziona la funzione substr: la funzione

Il substr (X, Y, Z) restituisce una stringa di stringa di input X che inizia con il carattere Y-esimo e che è Z caratteri lungo. ... Se Y è negativo, il primo carattere della sottostringa viene trovato contando da destra anziché da sinistra.

Quindi se si desidera che la stringa sia lunga 10 caratteri, passare -10 come parametro Y (per iniziare il conteggio da destra, 10 caratteri indietro) e passare 10 come parametro Z (per prendere 10 caratteri in totale) .

+0

Nessuna descrizione e c'è una risposta simile accettata :( –

+0

Sei il capo – Claudio

11

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10) funziona; sostituire '1234' con il codice prodotto, qualsiasi lunghezza < = 10.

+0

Non elegante, ma funzionale (+1). Grazie. – Christian

0

Oltre alla risposta diretta alla domanda da @ 9000, è necessario riflettere se la categoria, il gruppo e i numeri di prodotto non devono essere effettivamente memorizzati come testo.

+0

Perché dovrebbero essere memorizzati come testo o come numeri? (Soprattutto il numero del prodotto, dal momento che ho bisogno di ottenere il suo valore massimo + 1 per il prossimo numero di prodotto). – Martijn

+1

Il testo conserva gli zeri iniziali. C'è qualcosa da dire per la memorizzazione di "000123" quando è necessario memorizzare "000123". –

+0

che non è il problema. Ho bisogno di ottenere il prossimo valore; che significa averlo disponibile come numero e convertirlo in una stringa con prefisso zero. Il modo in cui è memorizzato è una questione separata interamente. – Martijn

4

So che questa è una vecchia questione, ma ciò che segue è semplice:

-- zero-pad to 4 digits: 
select substr('0000'||3,-4); 

substr non richiede una lunghezza se si sta selezionando fino alla fine.

Problemi correlati