道歉,如果这个问题已经得到解答,我已经做了大量的搜索,但没有找到答案(可能是因为我不确定它的措辞是否合适?)
是否可以使用设置前缀按字母顺序排列sort_by
?例如,我有一张表中的大学列表。一些大学以University of
(例如剑桥大学)为前缀,而其他大学则不是(例如达勒姆大学)。是否可以为MySQL定义一个忽略的前缀?
例如,以下列表
University of Cambridge
University of Bristol
Durham University
kings College London
应订购
University of Bristol
University of Cambridge
Durham University
Kings College London
答案 0 :(得分:3)
你可以这样做:
ORDER BY IF(SUBSTRING(name, 1, 14) = 'University of ', SUBSTRING(name, 15), name)
最好在此表格上创建一个视图,将额外的name_value
列集投影到上面的IF()
表达式。然后,您可以按此列排序并选择它,而不必使用IF()
污染您的查询。
示例视图,假设大学名称存储在name
列中:
CREATE VIEW Universities AS
SELECT
list_universities.*,
IF(SUBSTRING(name, 1, 14) = 'University of ',
SUBSTRING(name, 15),
name) AS name_value
FROM list_universities;
然后,您可以Universities
从list_universities
中选择name_value
,但它会有一个额外的ORDER BY IF(...)
列,您可以选择,或按顺序排列等等。< / p>
请注意,此方法(以及name
)将无法使用{{1}}上的任何索引来提高排序效果。
答案 1 :(得分:1)
你可以尝试
ORDER BY REPLACE(LOWER(fieldName), 'university of', '')
答案 2 :(得分:1)
可能的方式之一
order by replace(display_name, 'University of', '');
然而,应用函数来改变列的值将导致mysql被忽略的索引
通常人们会考虑复制另一列,
这一栏通常会删除那些不需要的词
(或将值排列为排序可以工作的方式)
假设clean字段命名为order_name
,
它应该包含
Bristol, University
Cambridge, University
Durham, University
Kings College Cambridge
Kings College London
所以,SQL可能是
select display_name
from tables
order by order_name;
答案 3 :(得分:0)
我把它放在SQL Management Studio中,所以我认为这是有效的MySql(我避免使用'with'作为例子)
SELECT UniversityName, REPLACE(UniversityName, 'University of', '') AS cleanName
FROM Universities c
ORDER BY cleanName