sqlite将逗号分隔的字符串作为sqlite3_result_text传递

时间:2015-12-17 06:44:22

标签: objective-c cocoa sqlite

我有一个自定义函数需要返回一个以逗号分隔的ID列表,然后我需要在语句中使用它们。但是,我似乎无法让它工作,因为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方法而不是单引号返回单个单词,则可以正常工作。当我使用逗号分隔的多个单词时,它就会停止工作。如何传回可以在此语句中使用的文本结果?

1 个答案:

答案 0 :(得分:1)

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

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

根据单个字符串值检查名称。

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