假设您不希望修改表的内容(因此查询效率稍低),以下应该可以解决问题。
(如果您确实有闲暇修改表格,请参阅此答案末尾的建议)
SELECT Title
FROM myTable
WHERE (Title LIKE 'x%' OR Title LIKE 'THE x%')
-- AND Title NOT LIKE 'THE [^T]%'
ORDER BY Title
注意:
- x 指定所需的字母(例如:LIKE 'A%' 等)
- 仅当“X”是字母“T”时才需要“AND TITLE NOT LIKE”额外条件(否则在功能上是多余的,但不会改变结果)
- 我不确定是否支持 the [^xyz]
(即不是字符 x、y 或 z),因此[^T]
可以将其替换为正等价的 say [A-RS-Z0-9]
。
还有一些其他停用词需要考虑(“A”、“AN”、“OF”......),但对于书籍或电影标题,通常只考虑“THE”。如果必须处理其他文章,逻辑可以扩展为:
SELECT Title
FROM myTable
WHERE (Title LIKE 'x%'
OR Title LIKE 'THE x%'
OR Title LIKE 'A x%'
OR Title LIKE 'AN x%')
-- the following is only needed when "x" is either the letter T or A.
-- AND (Title NOT LIKE 'THE [^T]%'
-- AND Title NOT LIKE 'A [^A]%'
-- AND Title NOT LIKE 'AN [^A]%'
-- )
ORDER BY Title
如果您可以修改表格的内容,则有更好的解决方案。其中一些意味着预先计算一个或几个额外的列(并在添加新记录时维护它/这些)。
- 例如,请参阅这篇文章中 Cletus 对“sort_column”方法的回答,其中额外的列包含去除任何不受欢迎的前导干扰词的标题。除了作为 OP 首字母搜索问题中的过滤字段之外,该列还可用于以更友好/明智的方式对由与首字母无关的过滤器生成的标题列表进行排序和/或标题的开头(比如按年份搜索)。
- 上面的一个变体是只存储“有效”的首字母(过去的不想要的噪音),使列更小,但用途也更少。
- 可以更新标题列本身,存储标题的修改形式,从而将无关的前导干扰词移动到括号之间的字符串末尾。这种做法在书目类型目录中很常见。