14

我在 sqlite db 中有一个名为 [tblbook] 的表,其中有一列 [authors]。我在 sql 中尝试做的是将作者值拆分为名字和姓氏,并按姓氏排序。我确实找到了这个很棒的代码:

 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 函数,因此它失败了。

任何人都可以请善意并告诉我什么应该是实现这一目标的最佳方法。

4

2 回答 2

33

另一种写法(短一点)是

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 及更高版本。

于 2014-07-23T15:45:02.763 回答
11

不幸的是,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;
于 2012-06-23T13:59:59.480 回答