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

Sql 按数据库字段中的第二个字符串排序,sql,sql-server,Sql,Sql Server,我有下面的sql语句,它使用街道名称而不是数字对地址字段(address1)进行排序。这似乎很好,但我希望街道名称按字母顺序显示。订单结束时的ASC不起作用 e、 g Address1字段可能包含 “5 Elm Close”-正常排序和顺序将按数字排序,下面将通过查看第二个字符串“Elm”进行排序 (使用SQL Server) 戈登的声明分类如下 1 Kings Road 10 Olivier Way 11 Albert Street 11 Kings Road 11 Princes Road

我有下面的sql语句,它使用街道名称而不是数字对地址字段(address1)进行排序。这似乎很好,但我希望街道名称按字母顺序显示。订单结束时的ASC不起作用 e、 g Address1字段可能包含 “5 Elm Close”-正常排序和顺序将按数字排序,下面将通过查看第二个字符串“Elm”进行排序 (使用SQL Server)

戈登的声明分类如下

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

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

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)

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

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)

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

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)

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

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)

我认为您根本不需要使用
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

此外,您还有一个
分组依据
,没有聚合函数。虽然这本身并没有错,但很奇怪。如果你得到重复的记录,只需使用
DISTINCT

我认为你根本不需要使用
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

此外,您还有一个
分组依据
,没有聚合函数。虽然这本身并没有错,但很奇怪。如果你得到重复的记录,只需使用
DISTINCT

我认为你根本不需要使用
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

此外,您还有一个
分组依据
,没有聚合函数。虽然这本身并没有错,但很奇怪。如果你得到重复的记录,只需使用
DISTINCT

我认为你根本不需要使用
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

此外,您还有一个
分组依据
,没有聚合函数。虽然这本身并没有错,但很奇怪。如果你得到重复的记录,只需使用
DISTINCT

试试这个:我根据Gordon的代码建立了它,但修改了它,删除了
左侧(AddressLine1,1
)部分-一个字符串永远无法与模式“n+空格+%”匹配

这适用于我的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
):


试试这个:我基于Gordon的代码,但修改了它,删除了
左侧(AddressLine1,1
)部分-一个字符串永远无法与模式“n+空格+%”匹配

这适用于我的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
):


试试这个:我基于Gordon的代码,但修改了它,删除了
左侧(AddressLine1,1
)部分-一个字符串永远无法与模式“n+空格+%”匹配

这适用于我的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
):


试试这个:我基于Gordon的代码,但修改了它,删除了
左侧(AddressLine1,1
)部分-一个字符串永远无法与模式“n+空格+%”匹配

这适用于我的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
):


这是在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)

这是在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)

这是在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)

这是在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)


那阁楼、123 Elm close或123 Dunroamin、Elm close或老隐修会Elm close和其他排列呢?为什么不分别存储房屋名称、房屋编号和街道?我想我可能不得不这样做,我应该在db设计中更具前瞻性!但目前我所有的地址都是“数字+街道名称”,我至少可以继续第一次发布,那
阁楼、123 Elm close
123“Dunroamin”、Elm close
老修道院Elm close
和其他排列呢?为什么不分别存储房屋名称、房屋编号和街道?我想我可能不得不这样做,我应该在db设计中更具前瞻性!但目前我所有的地址都是“数字+街道名称”,我至少可以继续第一次发布,那
阁楼、123 Elm close
123“Dunroamin”、Elm close
老修道院Elm close
和其他排列呢?为什么不分别存储房屋名称、房屋编号和街道?我想我可能不得不这样做,我应该在db设计中更具前瞻性!但目前我所有的地址都是“数字+街道名称”,我至少可以继续第一次发布,那
阁楼、123 Elm close
123“Dunroamin”、Elm close
老修道院Elm close
和其他排列呢?为什么不分别存储房屋名称、房屋编号和街道?我想我可能不得不这样做,我应该在db设计中更具前瞻性!但目前我所有的地址都是“数字+街道名称”,我至少可以继续第一次发布。不太有效。给出的结果与原始版本相同。请参见上面的输出。由AHiggins排序的地址按字母顺序排列。这不是按字母顺序排列的吗?这段代码看起来和我很相似。不太有效。给出的结果与最初的结果基本相同。请参见上面的输出。由AHiggins编写的一个按字母顺序排序。这不是按字母顺序排序的吗?这段代码看起来和我很相似。不太有效。给出了相同的结果