2015-12-17 47 views
0

我有一个自定义函数需要返回一个逗号分隔的ID列表,然后我需要在语句中使用。然而,我似乎无法得到它的工作,因为sqlite3_result_text似乎不满意我用于单个字符串的单引号。下面是我有:sqlite传递逗号分隔字符串为sqlite3_result_text

void sqliteExtractNames(sqlite3_context *context, int argc, sqlite3_value **argv) { 
    assert(argc == 1); 

    if (sqlite3_value_type(argv[0]) == SQLITE_TEXT) { 
    unsigned const char *stringC = sqlite3_value_text(argv[0]); 

    NSString *stringOrig = [[NSString alloc] initWithUTF8String:(char *) stringC]; 

    // This returns something like: 'Name 1', 'Name 2' 
    NSString *nameString = [self getCommaSeparatedNames: stringOrig]; 


    if ([nameString length] > 0) { 
     sqlite3_result_text(context, [nameString UTF8String], -1, SQLITE_TRANSIENT); 
    } else { 
     sqlite3_result_null(context); 
    } 
    } else { 
    sqlite3_result_null(context); 
    } 
} 

再后来我做:

SELECT count(*) FROM mytable WHERE name IN (sqliteExtractNames(somecolumn)) 

然而,这似乎并没有工作。如果我将getCommaSeparatedNames方法更改为不带单引号的单个单词,它就会起作用。当我用逗号分隔多个单词时,它停止工作。我怎样才能传递一个文本结果,可以在这个声明中使用?

回答

0

您的功能sqliteExtractNames返回单个字符串。所以你的查询是相当于:

SELECT ... WHERE name IN ('aaa,bb,ccc') 

它检查名称对单个字符串值。

如果你有SQLite 3.9.0或更高版本,你可以实现你的函数table-valued function,这很复杂。

+0

谢谢 - 是的,我意识到它在整个字符串周围放了一个单引号。有没有办法让sqlite没有操作返回一个字符串'原样'?我尝试使用sqlite3_result_blob无济于事。表值函数确实看起来非常复杂以满足我的需求。 – strangetimes

+1

“正常”函数返回单个值。 –