2010-06-23 9 views
5

Sto lavorando su un'app Android in cui l'utente ha diverse opzioni per l'ordinamento dei dati visualizzati che provengono dal database. Attualmente la mia stringa orderBy che mi passa per interrogare androidi() il metodo è simile al seguente:Determina il tipo di dati di una colonna in SQLite

"LOWER("+columnName+") ASC" 

Il problema di questo è che se il tipo di dati nella colonna specificata da columnName è intero, chiamando LOWER() su di esso sarà perché deve essere ordinato alfabeticamente, cioè basato solo sulla cifra più a sinistra, che ovviamente non ha alcun senso per i dati numerici. Quindi voglio solo applicare LOWER() se il tipo di dati della colonna non è intero. Quello che ho in mente è una dichiarazione come questa:

"CASE WHEN [data type of columnName is integer] THEN "+columnName+" ASC ELSE LOWER("+columName+") ASC END" 

La parte tra parentesi è ciò che non so come fare. SQLite fornisce una funzione per determinare il tipo di dati di una colonna?

risposta

10

vuoi veramente il tipo della colonna di , o il tipo di valore? (SQLite is dynamically-typed, quindi la distinzione è importante.)

Se si desidera quest'ultimo, è possibile utilizzare typeof(columnName).

+0

Nel mio caso non ha molta importanza. Il tipo dei valori deve corrispondere al tipo della colonna. Quindi typeof (columnName) dovrebbe funzionare perfettamente. Grazie mille. –

0

Hai dichiarato la colonna come un numero intero durante l'impostazione della tabella? Altrimenti sqlite lo memorizzerà come testo e le specie agiranno come hai descritto.

create table if not exists exampletable (columnName integer); 
+0

Sì, ho dichiarato le colonne numeriche come intero. E se rimuovo la chiamata a LOWER(), le colonne dei numeri interi vengono ordinate come desiderato. Ma ovviamente la chiamata LOWER() esiste per un motivo perché è così che voglio che le colonne di testo siano ordinate. –

6

Usa:

PRAGMA table_info(table-name); 

per ottenere informazioni Classifica.