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

2024-04-28 13:03:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个艺术家名单,专辑和曲目,我想用他们各自名字的第一个字母排序。当我想忽略“The”、“A”、“An”和其他各种非字母数字字符时,问题就出现了(与您“Weird Al”Yankovic和[dialog])。德詹开局不错?|但是我想忽略这些和我选择的其他几个。在

我在Django中使用带有utf8_bin排序规则的MySQL数据库执行此操作。在

编辑

好吧,我的错是没有提到这一点,但是我正在访问的数据库已经准备好了。它是由Amarok创建和维护的,如果没有一大堆问题,我无法更改它。也就是说,artist表的The Chemical Brothers列为The Chemical Brothers,所以我想我被困在这里了。这可能会很慢,但这不是我太担心,因为这是一个个人项目。在


Tags: thean数据库排序字母数字名字字符
2条回答

在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也有类似的beasties。在

你所要求的可能不是你所需要的。你可能不想只按第一个字母排序。如果艺术家第一次按字母排序的话,你也会按同样的字母排序。在

更新答案

你说过不允许你更改数据库。然后,您可以使用^{}来删除不感兴趣的单词,但请注意,这会很慢,因为查询将无法对列使用索引。在

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))

结果:

^{pr2}$

试验数据:

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等…)并按该列排序。或者,当您在应用程序中插入一行时,您可以使用触发器从数据库中插入该行。在

相关问题 更多 >