2012-06-22 16 views
7

Tôi có một bảng trong sqlite db gọi là [tblbook] với một cột [tác giả]. Những gì tôi đang cố gắng làm trong sql là để chia các giá trị tác giả để firstname và lastname và sắp xếp nó trên lastname. Tôi đã tìm thấy mã tuyệt vời này:Split FirstName và LastName trong 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 

Nó hoạt động hoàn hảo trên MSSQL nhưng sqlite không có hàm charindex do đó nó không thành công.

Có ai vui lòng tử tế và tư vấn cho tôi điều gì sẽ là phương pháp tốt nhất để đạt được điều này.

Trả lời

9

Đáng tiếc là chức năng này là mất tích từ SQLite:

lẽ bạn có thể ăn chức năng vị trí chuỗi tùy chỉnh của bạn để SQLite sử dụng http://www.sqlite.org/c3ref/create_function.html

Nhưng nếu bạn thực sự cần nó, có một phức tạp, không hiệu quả workaround:

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

1: tạo ra một số bảng/xem

2: tham gia tác giả bảng số, và chọn vị trí MIN của không gian

3: Bây giờ bạn có thể chia tên

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

Cảm ơn bạn đã giải thích cho biziclop. Nhiều đánh giá cao!! – snowflakes74

+0

Có lẽ lý do họ không bao gồm tìm kiếm chuỗi là họ không muốn xử lý các mã hóa khác nhau, utf/8/16/666, v.v. vì điều đó sẽ làm tăng kích thước mã sqlite. – biziclop

21

một cách khác (ngắn hơn một chút) để viết thứ sẽ là

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 

Điều này sẽ áp dụng cho phiên bản 3.7.15 trở lên.