2012-02-27 15 views
5

Ho un database SQLITE3 in cui ho memorizzato varie colonne. Una colonna (cmd) in particolare contiene la riga di comando completa e i parametri associati. C'è un modo per estrarre solo la prima parola in questa colonna (appena prima del primo spazio)? Non sono interessato a vedere i vari parametri usati, ma voglio vedere il comando emesso.Estrarre la prima parola in un database SQLite3

Ecco un esempio:

selezionare cmd dal limite log2 3;

user-sync //depot/PATH/interface.h 
    user-info 
    user-changes -s submitted //depot/PATH/build/[email protected]/12/06:18:31:10,@2012/01/18:00:05:55 

Dal risultato di cui sopra, mi piacerebbe utilizzare una funzione inline SQL (se disponibile in SQLITE3) per analizzare in prima istanza di spazio, e magari utilizzare una chiamata di funzione a sinistra (so che questo non è disponibile in SQLITE3) per restituire solo la stringa "user-sync". Lo stesso per "user-info" e "user-changes".

Qualche idea?

Grazie.

risposta

5

mio soluion:

sqlite> CREATE TABLE command (cmd TEXT); 
sqlite> INSERT INTO command (cmd) VALUES ('ls'),('cd ~'),(' mpv movie.mkv '); 
sqlite> SELECT substr(trim(cmd),1,instr(trim(cmd)||' ',' ')-1) FROM command; 
ls 
cd 
mpv 

Pro:

  • non è che un hack sporco
  • utilizza solo le funzioni di base
3

Dato che la posizione del tuo primo personaggio spaziale è sconosciuta, non credo che in SQLite ci sia una funzione di base che aiuterà.

penso che dovrete crearne uno http://www.sqlite.org/c3ref/create_function.html

+0

No, ma ci sono 3 funzioni principali che aiuteranno! Vedi la mia risposta. –

1

non credo che è qualcosa che sarete in grado di fare all'interno della SQL stesso. Il supporto di SQLite per le funzioni di gestione delle stringhe non è esteso come altri RDBMS (alcuni dei quali ti consentono di eseguire un SUBSTR con Reg Exp).

Il mio suggerimento è quello di scrivere la propria funzione SQL come suggerito da @Jon o semplicemente farlo come passaggio post-elaborazione nel codice dell'app.

2

Ecco un hack

sqlite> create table test (a); 
sqlite> insert into test values ("This is a test."); 
sqlite> select * from test; 
This is a test. 
sqlite> select rtrim(substr(replace(a,' ','----------------------------------------------------------------------------------------'),1,80),'-') from test; 
This 

Funziona fino a quando il comando più lunga è inferiore a 80 caratteri (e si include 80 '-' caratteri nella stringa di sostituzione - non li ho contati!) . Se i tuoi comandi possono contenere '-' usa solo un carattere diverso che non è permesso nei comandi.

+2

È intelligente! – jon

1

La funzione "Trova la prima occorrenza" è una delle funzioni di base di SQLite3 (http://www.sqlite.org/lang_corefunc.html).

Naturalmente, è molto meglio usare instr(X,Y).

Così si può scrivere:

SELECT substr(cmd,1,instr(cmd,' ')-1) FROM log2 
Problemi correlati