matchinfo函数是否适用于包含多个SELECT语句的查询?

时间:2014-11-07 08:03:54

标签: sqlite full-text-search

我使用带有matchinfo功能的SQLite FTS VIRTUAL TABLE查询,它工作得很好。查询如下:

SELECT 
    docid as _id,
    KEY_NAME,
    KEY_INDEX,
    KEY_TEXT,
    KEY_TRANS,
    hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
     from FTS_VIRTUAL_TABLE
     where KEY_TEXT MATCH '"\""+inputText+"\"*"+" ';

现在我必须在具有多个SELECT语句的同一个TABLE查询中实现matchinfo。但它崩溃了应用程序。我的代码如下:

SELECT 
    docid as _id,
    KEY_NAME,
    KEY_INDEX,
    KEY_TEXT,
    KEY_TRANS,
    from FTS_VIRTUAL_TABLE
    where docid in (
    SELECT 
        docid 
        hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES    **//it does not work here also**

        from FTS_VIRTUAL_TABLE
        where KEY_TEXT MATCH '"\""+inputText+"\"*"+" '

    union

    SELECT 
        docid 
        hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES    **//nor here**

        from FTS_VIRTUAL_TABLE
        where KEY_TRANS MATCH '"\""+inputText+"\"*"+" ');

上面代码中注释的代码行导致App Crash。任何帮助将受到高度赞赏。谢谢!

修改

堆栈跟踪提供以下错误消息

  

android.database.sqlite.SQLiteException:只允许一个结果   对于作为表达式(代码1)的一部分的SELECT:同时   将SELECT docid编译为_id,KEY_NAME,kEY_INDEX,KEY_TEXT,   KEY_TRANS,来自FTS_VIRTUAL_TABLE,其中docid(SELECT docid   十六进制(matchinfo(FTS_VIRTUAL_TABLE))AS KEY_OCCURRENCES来自   FTS_VIRTUAL_TABLE,其中KEY_TEXT MATCH'" \"" + inputText +" \" " +" '   union SELECT docid hex(matchinfo(FTS_VIRTUAL_TABLE))AS   来自FTS_VIRTUAL_TABLE的KEY_OCCURRENCES,KEY_TRANS MATCH   '" \"&#34 + +的inputText" \" " +" &#39);

1 个答案:

答案 0 :(得分:0)

问题是子查询的结构。当您使用SELECT获取要与IN进行检查的项目列表时,SLQ需要一个简单的1维结果(即{'a','b','c'})。由于内部SELECT查询中有多个术语,因此IN语句将获得复杂结果的列表(即{{'a',1},{'b',2},{'c',3}}) 。如果你想以这种方式使用内部SELECTS而你不需要matchinfo,你必须删除

hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
来自内部SELECT查询的

。如果你确实需要将matchinfo作为你的UNION的一部分(没有更多的上下文就很难分辨),那么你需要另一个子查询来包装整个UNION并只返回docid到顶级查询。像这样:

 SELECT 
    docid as _id, KEY_NAME, KEY_INDEX, KEY_TEXT, KEY_TRANS,
    from FTS_VIRTUAL_TABLE
    where docid in (
    --wrap the UNION so that only the docids are returned to the IN
    SELECT docid from(
    SELECT 
        docid 
        hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
        from FTS_VIRTUAL_TABLE
        where KEY_TEXT MATCH '"\""+inputText+"\"*"+" '

    union

    SELECT 
        docid 
        hex(matchinfo(FTS_VIRTUAL_TABLE)) AS KEY_OCCURRENCES
        from FTS_VIRTUAL_TABLE
        where KEY_TRANS MATCH '"\""+inputText+"\"*"+" '
   )
);