MYSQL数据库中的表具有地址详细信息 - 例如...... add1,add2,add3,district,postalTown,country
通过邮政城镇订购通常很好,但一些细节在postalTown列中有数字。例如1420 Territet或3100 Overijse。这意味着这些将出现在阿伯丁或布里斯托尔的顶部。有没有一种方法可以通过postalTown排序,但是按照第一个字母字符排序?这意味着上述的顺序将是 - 阿伯丁,布里斯托尔,Overijse,Territet
由于
答案 0 :(得分:2)
写一个表达式,它将返回第一个字母字符,然后只按顺序排列[表达式]
Order By substring(LTrim(
Replace(Replace(Replace(Replace(Replace(
Replace(Replace(Replace(Replace(Replace(
colname, '1', ''),'2',''),'3',''),'4,''),'5', ''),
'6',''),'7',''),'8',''),'9',''),'0',''))
1,1)
如果您希望行按整个城市名称排序,而不是仅按第一个字符排序(如问题标题所指定),请使用以下内容:
Order By LTrim(
Replace(Replace(Replace(Replace(Replace(
Replace(Replace(Replace(Replace(Replace(
colname, '1', ''),'2',''),'3',''),'4,''),'5', ''),
'6',''),'7',''),'8',''),'9',''),'0',''))
上面是一个猜测(我还没试过),但想法是先从列值中删除所有数字字符,然后取剩余的第一个字符。
此外,如果这有效,并且您对dataabse有任何开发访问权限(思考DRY原则),我会在此表中添加一个计算列(或对表的单独视图),该列被定义为使用上面的表达式,以便城镇名称的“ 提取 ”可用于可能想要访问它的所有其他代码,而无需在任何地方复制此表达式,您可能需要它..
答案 1 :(得分:2)
您可以编写一个存储函数,该函数返回从第一个字母字符开始的列的其余部分(可能使用REGEXP来查找该索引)。然后按存储的函数排序。
编辑:代替函数中的regexp,根据数据格式,你可以在''(空格)上执行'substring_index'并返回第一个空格的索引,然后调用substring返回字符串之后的剩余部分第一空间。
一旦你创建了一个存储函数来返回数字后面的字符串,你可以像这样使用它:
order by yourfunctionname(postalTown)
答案 2 :(得分:1)
我想到的第一件事就是在我的ORDER BY上执行以下操作,显然,添加数字0到9. 你会发现糟糕的模式会产生糟糕的解决方案。 :)作为绅士上面说过,你应该考虑重新设计你如何存储你的城镇数据。
ORDER BY REPLACE(REPLACE(REPLACE(FieldName, '1', ''),'2',''),'3','') ETC.
答案 3 :(得分:1)
在表格上创建一个视图,进行所需的任何翻译,然后查看视图?