按数据库字段中的第二个字符串排序

时间:2014-12-04 13:54:49

标签: sql sql-server

我有下面的sql语句,它使用街道名称而不是数字对地址字段(address1)进行排序。这似乎工作正常,但我希望街道名称按字母顺序显示。订单结束时的ASC没有帮助 例如,Address1字段可能包含 " 5榆树关闭" - 正常的排序和顺序将按下面的数字排序,通过查看第二个字符串" Elm" (使用SQL Server)

SELECT tblcontact.ContactID, tblcontact.Forename, tblcontact.Surname, 
tbladdress.AddressLine1, tbladdress.AddressLine2 
FROM tblcontact 
INNER JOIN tbladdress 
  ON tblcontact.AddressID = tbladdress.AddressID 
LEFT JOIN tblDonate 
  ON tblcontact.ContactID = tblDonate.ContactID 
WHERE (tbladdress.CollectionArea = 'Queens Park')
GROUP BY tblcontact.ContactID, tblcontact.Forename, tblcontact.Surname, 
tbladdress.AddressLine1, tbladdress.AddressLine2
ORDER BY REVERSE(LEFT(REVERSE(tbladdress.AddressLine1), 
            charindex(' ', REVERSE(tbladdress.AddressLine1)+' ')-1)) asc

戈登的陈述如下:

1 Kings Road
10 Olivier Way
11 Albert Street
11 Kings Road
11 Princes Road
120 High Street

4 个答案:

答案 0 :(得分:1)

如果您假设街道名称是空格分隔字符串中的第一个或第二个值,您可以尝试:

order by (case when left(tbladdress.AddressLine1, 1) like '[0-9]% %'
               then substr(tbladdress.AddressLine1, charindex(' ', tbladdress.AddressLine1) + 1), len(tbladdress.AddressLine1) )
               else tbladdress.AddressLine1
          end)

答案 1 :(得分:1)

我认为你根本不需要使用REVERSE()。这似乎是一个陷阱。

ORDER BY 
    CASE
        WHEN ISNUMERIC(LEFT(tbladdress.AddressLine1,CHARINDEX(' ',tbladdress.AddressLine1) - 1))
        THEN RIGHT(tbladdress.AddressLine1,LEN(tbladdress.AddressLine1) - CHARINDEX(' ',tbladdress.AddressLine1))
        ELSE tbladdress.AddressLine1
    END,
    CASE 
        WHEN ISNUMERIC(LEFT(tbladdress.AddressLine1,CHARINDEX(' ',tbladdress.AddressLine1) - 1))
        THEN CAST(LEFT(tbladdress.AddressLine1,CHARINDEX(' ',tbladdress.AddressLine1) - 1) AS INT)
        ELSE NULL
    END

此外,您有GROUP BY没有聚合函数。虽然这没有错,但这本身就很奇怪。如果您正在获取重复记录,请使用DISTINCT

答案 2 :(得分:1)

试试这个:我基于戈登的代码,但改为删除LEFT(AddressLine1, 1)部分 - 单字符字符串永远不会匹配模式“ n + < em> space +%“。

这适用于我的SQL-Server 2012环境:

WITH tbladdress AS 
  (
    SELECT AddressLine1 FROM (VALUES ('1 Kings Road'),('10 Olivier Way'), ('11 Albert Street')) AS V(AddressLine1)
  )

SELECT 
    AddressLine1
FROM tbladdress 
order by (case when tbladdress.AddressLine1 like '[0-9]% %'
               then substrING(tbladdress.AddressLine1, charindex(' ', tbladdress.AddressLine1) + 1, len(tbladdress.AddressLine1))
               else tbladdress.AddressLine1
          end)

这被编辑为更类似于Gordon的代码(结束括号的位置,substr而不是substring):

order by (case when tbladdress.AddressLine1 like '[0-9]% %'
               then substr(tbladdress.AddressLine1, charindex(' ', tbladdress.AddressLine1) + 1), len(tbladdress.AddressLine1)
               else tbladdress.AddressLine1
          end)

答案 3 :(得分:0)

这是在sql server

中有效的代码
order by (case when tbladdress.AddressLine1 like '[0-9]% %'
then substrING(tbladdress.AddressLine1, charindex(' ', tbladdress.AddressLine1) + 1, len(tbladdress.AddressLine1))
else tbladdress.AddressLine1
end)