12

我正在使用 C# 显示从 SQLite 数据库调用的电影标题列表。目前,我正在使用一个自定义 ListBox 类,该类具有对从每个项目的开头剥离单词“The”的文本进行排序的功能。然而,这似乎并不是最简单的方法,因为它从 SQLite 数据库调用然后排序。我宁愿将其减少到一步,希望直接从我的“SELECT”查询中的数据库中排序。

我对此进行了一些搜索,并找到了一些建议,包括在数据库中创建一个额外的排序列。虽然这当然是一种可能性,但我想知道是否有任何更简单的选项不需要插入几乎相同的重复信息(特别是如果数据库变得更大)。我对 SQLite 很陌生,但我读过一些关于创建可用于创建自定义排序的整理函数的内容。但是,我不确定这是否适合使用它,并且似乎无法找到在 C# 中实现它的任何帮助。

希望有人可以分享一些指导。如果一个额外的排序列是最好的方法,那么这就是我要做的。

4

6 回答 6

6

这是解决方案:

ORDER BY (CASE 
    WHEN sortTitle LIKE 'the %' THEN substr(sortTitle,5) 
    WHEN sortTitle LIKE 'a %' THEN substr(sortTitle,3) 
    WHEN sortTitle LIKE 'an %' THEN substr(sortTitle,4) 
    ELSE sortTitle END)
于 2013-03-02T01:51:33.343 回答
6

为了避免插入重复数据,有两列怎么样:TITLE_PREFIX(通常为空,但有时包含“The”或“A”;此列没有索引)和TITLE(包含没有“The”或“A”的标题;这是您创建索引的列)。要显示数据,您必须结合 TITLE_PREFIX 和 TITLE。但是您只需搜索 TITLE。

于 2010-09-12T18:38:14.617 回答
1

您可以将每个标题存储在 2 个部分中:titleprefix.

使用 SQLite,您可以通过|| operator也称为concatenate operator.

这是一个例子:

SELECT prefix || ' ' || title FROM movies ORDER BY title

您也可以ltrim在前缀为空的情况下使用,因此前面没有空格:

SELECT ltrim(prefix || ' ' || title) FROM movies ORDER BY title

另一种选择是将前缀存储在标题的末尾。例如,在许多电影商店中,您会看到如下内容:

三个火枪手,

于 2010-09-12T18:38:39.347 回答
0

在 C# 代码中

如果您想在 C# 中执行此操作,请使用 LINQ 为您进行排序。我已经在 PasteBin 上发布了一个完整的示例。这将允许您:

  • 避免在数据库中重复数据
  • 像往常一样利用数据库索引,无论是哪个 RDBMS
  • 在配置文件中放入干扰词,从而在修改列表时减少停机/重建/重新部署
  • 确保解决方案在您的客户端代码中更具可读性
DropDownList1.DataSource = myBooks.OrderBy(n => ReplaceNoise(n.Title))

public string ReplaceNoise(string input)
{
     string[] noise = new string[] { "the", "an", "a" };

     //surely this could be LINQ'd 
     foreach (string n in noise)
     {
         if (input.ToLower().StartsWith(n))
         {
             return input.Substring(n.Length).Trim();
         }
     }
     return input;
}

在您的 SQLite 语句中

简单地用空格替换噪声词怎么样?这是一个丑陋的第一步,但强烈考虑使用一个新列来存储此值以进行排序。

ORDER BY REPLACE(REPLACE([title],'the',''), 'a', '')

不可否认,当你最终得到这个时,这会变得很难看:

REPLACE(REPLACE(REPLACE(REPLACE([title],'The ',''),'a',''),'of',''),'by','')
于 2010-09-12T18:43:00.880 回答
0

您可以尝试在标题上构建一个支持全文搜索(使用FTS模块)的表。然后,您将能够对标题中的任何单词进行快速搜索,而无需您进行大量额外工作。例如,用户查询good bad ugly可能会产生“The Good, the Bad and the Ugly”作为其第一个结果之一。所有这些的额外成本大约是文本本身长度的四分之一,但对于您的数据集可能更多,因为标题不是完整的英文文本。您还需要花时间构建这些额外的索引——您不想在实时系统上的主数据集上构建它们(显然)——但这应该不是太大的问题。

于 2010-09-12T21:35:07.497 回答
0

Create a virtual column (result of a function that can be implemented in C#) and sort on this virtual column. The function could move "The" to the end as in "Three Musketeers, The" or discard "The", whatever you want it to do.

于 2010-09-14T18:02:10.803 回答