2012-06-22 135 views
7

我在sqlite數據庫中有一個表,名爲[tblbook],並帶有一列[authors]。我在SQL中想要做的是將作者值分成名字和姓氏並按姓氏排序。我確實發現這個偉大的代碼:在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 

它在MSSQL上完美工作,但sqlite沒有charindex功能,因此它失敗。

任何人都可以請善良,並告訴我什麼應該是最好的方法來實現這一點。

回答

9

不幸的是這個功能是從SQLite的丟失:

也許你可以使用養活你的自定義字符串位置功能的SQLite http://www.sqlite.org/c3ref/create_function.html

但是,如果你真的需要它,有一個複雜的,無效的解決方法:

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

1:創建一個數字表/視圖

2:加入作者爲數字表,並選擇MIN位置空間的

3:現在你可以拆分名

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

謝謝biziclop的解釋。非常感激!! – snowflakes74

+0

也許他們不包括字符串搜索的原因是他們不想處理不同的編碼,utf/8/16/666等,因爲這會炸掉sqlite代碼的大小。 – biziclop

21

另一種方式(短一些)寫個將是

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 

這將適用於3.7.15及以上版本。