2012-06-22 11 views
7

Ho una tabella in sqlite db chiamata [tblbook] con una colonna [autori]. Quello che sto cercando di fare in sql è dividere i valori dell'autore in firstname e il lastname e ordinarlo su lastname. Ho trovato questo grande codice:Split FirstName e LastName in sqlite

SELECT substr(BookAuthor, 1, NULLIF(CHARINDEX(' ', BookAuthor) - 1, -1)) AS [FirstName], 
    substr(BookAuthor, CHARINDEX(' ', BookAuthor) + 1, LEN(BookAuthor)) AS [LastName] 
FROM tblBook where _id=3 

funziona perfettamente su MSSQL ma SQLite non ha la funzione di charindex quindi fallisce.

Qualcuno potrebbe essere gentile e mi consiglia quale dovrebbe essere l'approccio migliore per raggiungere questo obiettivo.

risposta

9

Purtroppo questa funzionalità non è presente SQLite:

forse si può alimentare la vostra funzione di posizione stringa personalizzata per SQLite usando http://www.sqlite.org/c3ref/create_function.html

Ma se si ha realmente bisogno, c'è un complesso, soluzione inefficace:

http://sqlfiddle.com/#!7/e03a4/3

1: creare una tabella numeri/vista

2: unire autori alla tabella numeri, e scegliere la posizione MIN dello spazio

3: ora è possibile dividere i nomi

SELECT 
    substr(name, 1, pos-1) AS first_name, 
    substr(name, pos+1) AS last_name 
FROM (
     SELECT 
     author.name, 
     numbers.x AS pos 
     FROM  author 
     INNER JOIN numbers 
     WHERE substr(author.name, numbers.x, 1) = ' ' 
     GROUP BY author.name 
    ) AS a 
ORDER BY last_name; 
+1

Grazie mille per la spiegazione. Molto apprezzato!! – snowflakes74

+0

Forse la ragione per cui non includono la ricerca di stringhe è che non volevano trattare con codifiche diverse, utf/8/16/666, ecc., Perché ciò avrebbe fatto esplodere la dimensione del codice sqlite. – biziclop

21

un altro modo (un po 'più corto) di scrivere esimo sarebbe

SELECT 
    substr(BookAuthor, 1, instr(BookAuthor, ' ') - 1) AS first_name, 
    substr(BookAuthor, instr(BookAuthor, ' ') + 1) AS last_name 
FROM tblBook where id=3 
ORDER BY last_name 

Ciò si applica alla versione 3.7.15 e oltre.