我有一个街道地址列表,我想按以下顺序排序:
当我做一条简单的order by
街道时,我得到:
Street 1, Street 205, Street 207 B, Street 27 A, Street 27 F, Street 30 D, Street 30 D
这不是我想要的。
我找不到任何好的例子,这里有一个here但这恰恰相反。
答案 0 :(得分:2)
考虑到你已经将地址表分为两列road
和house_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
排序