SQL查询(排序街道地址)

时间:2014-08-11 14:00:08

标签: mysql sql

我有一个街道地址列表,我想按以下顺序排序:

  • Street 1
  • Street 27 A
  • 街27楼
  • Street 30 D
  • Street 31 D
  • Street 205
  • Street 207 B

当我做一条简单的order by街道时,我得到:

Street 1, Street 205, Street 207 B, Street 27 A, Street 27 F, Street 30 D, Street 30 D 

这不是我想要的。

我找不到任何好的例子,这里有一个here但这恰恰相反。

4 个答案:

答案 0 :(得分:2)

考虑到你已经将地址表分为两列roadhouse_number(后者有补充),以下查询(PostgreSQL)可以解决问题(订购不同道路的地址'道路'):

SELECT road, house_number from address_table
WHERE road = 'The Road'
ORDER BY CAST(regexp_replace(house_number, '[[:alpha:]]', '') AS INTEGER),
         regexp_replace(house_number, '[[:digit:]]', '')

似乎还有使用MySQL的正则表达式替换的方法:How to do a regular expression replace in MySQL?

答案 1 :(得分:1)

ORDER_BY your_Order * 1 ASC

会将其转换为数字,因为它似乎是文本值。

检查表定义并进行更改。您可以将数据类型更改为int

ALTER TABLE your_Table MODIFY COLUMN registration_no int;

答案 2 :(得分:1)

如果所有列都以单个单词(例如'Street')开头,后跟空格和数字,则可以执行以下操作:

order by substring_index(streetaddress, ' ', 2) + 0

这将转换第二个"字"在地址中用于排序的数字。

如果您的实际数据与示例数据不同,我建议您提出另一个问题,并提供适当的示例,说明您的数据真实情况。

答案 3 :(得分:-1)

试试这个

地址为

(
SELECT 
Address1, 
Postcode,
CASE WHEN ISNUMERIC(SUBSTRING(LTRIM(Address1), 1, 1)) = 1 THEN 'yes' ELSE 'no' END AS StartsWithNumber,
CASE WHEN ISNUMERIC(SUBSTRING(LTRIM(Address1), 1, 1)) = 1 THEN SUBSTRING(Address1, 1, CHARINDEX(' ', Address1)) END AS housenumber
FROM youttable )

从地址

中选择地址1

按StartsWithNumber asc,housenumber,Address1

排序