匹配第一个字母数字字符跳过(| An?)

时间:2010-04-10 20:48:43

标签: python mysql regex

我有一个艺术家,专辑和曲目列表,我想用他们各自名字的第一个字母排序。当我想忽略“The”,“A”,“An”和其他各种非字母数字字符(与你交谈“Weird Al”Yankovic和[对话])时,问题就出现了。 Django有一个很好的开始'^(An?| The)+'但是我想忽略那些以及我选择的其他几个。

我在Django中这样做,使用带有utf8_bin校对的MySQL数据库。

修改

我没有提到这个问题,但我访问的数据库只是准备就绪。它由Amarok创建和维护,如果没有一堆问题,我无法改变它。据说艺术家表格The Chemical Brothers被列为The Chemical Brothers所以我想我被困在这里。它可能会很慢,但这对我来说并不是一个问题,因为它是一个个人项目。

2 个答案:

答案 0 :(得分:3)

你所要求的可能不是你所需要的。您可能不希望仅按第一个字母排序。如果第一个字母相同,那么您通常也希望查看第二个字母等。当您按艺术家排序时,这将导致同一艺术家的所有歌曲组合在一起。

更新回答

您说您不允许更改数据库。然后你可以使用TRIM(LEADING ... FROM ...)来删除不感兴趣的单词,但请注意,由于查询无法在列上使用索引,因此速度会很慢。

SELECT *
FROM song
WHERE SUBSTRING(TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title)), 1, 1) = 'B'
ORDER BY TRIM(LEADING 'The ' FROM TRIM(LEADING 'A ' FROM title))

结果:

'The Bar'   -- "The" is ignored when sorting.
'Baz A'    

测试数据:

CREATE TABLE song (title NVARCHAR(100) NOT NULL);
INSERT INTO song (title) VALUES
('The Bar'),
('Baz A'),
('Foo'),
('Qux'),
('A Quux');

原始答案

另请注意,如果您ORDER BY列的功能,当您拥有大量记录时,它将非常慢,因为该列上的索引无法使用。相反,您应该存储另一列,删除所有不感兴趣的单词(the,an等等)并按该列排序。您可以在插入行时从应用程序插入该列,或者在数据库中使用触发器。

答案 1 :(得分:0)

在PostgreSQL中,我发现这是一种很好的方式来开始这种排序:

SELECT title
FROM  albums
ORDER BY    
  CASE 
    WHEN title ~* '^The ' THEN substring(title from 5)
    WHEN title ~* '^An '  THEN substring(title from 4)
    WHEN title ~* '^A '   THEN substring(title from 3)
    ELSE title
  END asc;

我猜想MySQL有类似的野兽。