我在sqlite db中有一个名为[tblbook]的表,其中有一列[authors]。我在sql中尝试做的是将作者值拆分为firstname和lastname,并在lastname上对其进行排序。我找到了这个很棒的代码:
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函数,因此失败了。
任何人都可以表示友好,并建议我应该采取什么样的方法来实现这一目标。
答案 0 :(得分:28)
写这个的另一种方式(稍短)将是
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及更高版本。
答案 1 :(得分:10)
不幸的是,SQLite缺少此功能:
也许您可以使用http://www.sqlite.org/c3ref/create_function.html
将自定义字符串位置函数提供给SQLite但如果你真的需要它,那么就会有一个复杂,无效的解决方法:
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;