我无法为我的问题找到正确的查询。我在数据库中有一个表,我需要以一种非常具体的方式对它进行排序 - 我正在排序的列是一个地址,它以数字开头,但是我需要对它进行排序而忽略数字。
这是我的数据集:
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.
任何人都可以帮我解决这个问题吗?
答案 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 STREET
,CITY
,APARTMANT_NUMBER
ETC,如果没有,它们就会导致这一点。
答案 1 :(得分:2)
如果您使用SQL Server,则可以使用PATINDEX
和STUFF
的组合:
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