14

sqlite dbに、[authors]列を持つ[tblbook]というテーブルがあります。私が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:著者を数字の表に結合し、スペースの最小位置を選択します

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 に答える