2012-06-22 13 views
7

Tengo una tabla en sqlite db llamada [tblbook] con una columna [authors]. Lo que trato de hacer en el sql es dividir los valores del autor en firstname y lastname y ordenarlo en lastname. Lo que encontrar este gran código:Split FirstName y LastName en 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 

Funciona perfectamente en MSSQL pero SQLite no tiene la función charindex por lo tanto, se produce un error.

¿Alguien podría ser amable y aconsejarme cuál debería ser el mejor enfoque para lograr esto.

Respuesta

9

Por desgracia, esta funcionalidad no se encuentra en SQLite:

Tal vez usted puede alimentar a su función de posición cadena personalizada a SQLite usando http://www.sqlite.org/c3ref/create_function.html

Pero si realmente lo necesita, hay un complejo, solución ineficaz:

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

1: crear una tabla de números/vista

2: unirse a los autores a tabla de números, y elegir la posición MIN del espacio

3: ahora se puede dividir los nombres

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

Gracias biziclop por su explicación. ¡¡Muy apreciado!! – snowflakes74

+0

Tal vez la razón por la que no incluyen la búsqueda de cadenas es que no querían tratar con diferentes codificaciones, utf/8/16/666, etc., porque eso explotaría el tamaño del código sqlite. – biziclop

21

Otra forma (un poco más corto) para escribir º sería

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 

Esto se aplicaría para la versión 3.7.15 y posteriores.