在sqlite中拆分FirstName和LastName

时间:2012-06-22 12:10:00

标签: sqlite

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

任何人都可以表示友好,并建议我应该采取什么样的方法来实现这一目标。

2 个答案:

答案 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;