如何按字母顺序排序SQL查询但忽略前导数字?

时间:2016-08-09 11:23:20

标签: sql database vb.net sorting

我无法为我的问题找到正确的查询。我在数据库中有一个表,我需要以一种非常具体的方式对它进行排序 - 我正在排序的列是一个地址,它以数字开头,但是我需要对它进行排序而忽略数字。

这是我的数据集:

id  | address
1   | 23 Bridge road
2   | 14 Kennington street
3   | 7  Bridge road
4   | 12 Oxford street
5   | 9  Bridge road

我需要对此进行排序:

id | address
1  |  7 Bridge road
2  |  9 Bridge road 
3  | 23 Bridge road
4  | 14 Kennington street
5  | 12 Oxford street

到目前为止,我只得到了这个:

SELECT id, address
FROM propertySearch
Order by address ASC. 

任何人都可以帮我解决这个问题吗?

5 个答案:

答案 0 :(得分:3)

如果这将始终是那种格式(前导号码,空格,然后是地址),那么你可以这样做:

SQL-服务器:

SELECT * FROM YourTable t
ORDER BY SUBSTRING(t.address,CHARINDEX(' ',t.address,1),99)

MySQL:

SELECT * FROM YourTable t
ORDER BY SUBSTRING_INDEX(t.address,' ',-1) 

如果格式不是常量,则可以使用SQL-Server patindex()

SELECT * FROM YourTable t
ORDER BY SUBSTRING(t.address,PATINDEX('%[A-z]%',t.address),99)

注意:这是糟糕的数据库设计!!每个值都应该正确存储在自己的列中,例如E.G STREETCITYAPARTMANT_NUMBER ETC,如果没有,它们就会导致这一点。

答案 1 :(得分:2)

如果您使用SQL Server,则可以使用PATINDEXSTUFF的组合:

SELECT *, STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, '')
FROM #Table1 AS T
ORDER BY STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, '')

PATINDEX会在字符串中找到第一个字母索引,STUFF用于修剪从开头到该索引的所有内容。

那是输出:

id  address                 No column name)
---------------------------------------------
1   23 Bridge road          Bridge road
3   7  Bridge road          Bridge road
5   9  Bridge road          Bridge road
2   14 Kennington street    Kennington street
4   12 Oxford street        Oxford street

我也注意到你的预期输出有不同的顺序。如果那是有意的。您需要使用ROW_NUMBER:

SELECT ROW_NUMBER() OVER(ORDER BY STUFF(T.address, 1, PATINDEX('%[A-z]%', T.address) - 1, ''), T.id) AS ID, T.address
FROM #Table1 AS T;

此查询将为每一行生成新ID 结果:

id  address
------------------------
1   23 Bridge road
2   7  Bridge road
3   9  Bridge road
4   14 Kennington street
5   12 Oxford street

<小时/> 无论如何,这是一个相当愚蠢的解决方案。

我建议您将地址存储在单独的列中,例如街道名称,邮政编码,门牌号码,家庭信件(可选),城镇等。这将是一个更好的方法。

答案 2 :(得分:1)

我认为这种操作更适用于业务层 如果将所有数据加载到.net代码 - 排序将更容易,更易读和可维护。

Public Class Address

    Public Property Id As Integer
    Public Property AddressData As String

    'This property can be used for sorting       
    Public ReadOnly Property SortedKey As String
        Get
           Dim rawData As IEnumerable(Of String) = Me.AddressData.Split(" "c).Skip(1)
           Return String.Join(" ", rawData)
        End Get
    End Property

End Class

然后将其与LINQ一起使用

Dim loaded As List(Of Address) = yourLoadFunction()
Dim sorted = loaded.OrderBy(Function(item) item.SortedKey).ToList()

答案 3 :(得分:0)

当你标记了vb.net时,猜猜你使用的是MS SQL。如果您始终使用空格分隔街道号码和街道名称,请尝试按以下顺序排序:

ORDER BY RIGHT([address], LEN([address]) - CHARINDEX(' ', [address], 1))

答案 4 :(得分:0)

Declare @Table table (id int,address varchar(100))
Insert into @Table values
(1,'23 Bridge road'),
(2,'14 Kennington street'),
(3,'7 Bridge road'),
(4,'12 Oxford street'),
(5,'9 Bridge road')

Select * From @Table
 Order By substring(address,patindex('%[a-z]%',address),200)
         ,cast(substring(address,1,charindex(' ',address)) as int)

返回

id  address
3   7 Bridge road
5   9 Bridge road
1   23 Bridge road
2   14 Kennington street
4   12 Oxford street