Sql server 2005 SQL中的Order BY
在我的SQL语句中,需要解析一个标题字段,这样我就可以按整数排序。基本上,只需将整数提取到一个新字段中,并对该字段进行排序 标题字段中的数据如下所示(错误): 订购人之后(正确)Sql server 2005 SQL中的Order BY,sql-server-2005,Sql Server 2005,在我的SQL语句中,需要解析一个标题字段,这样我就可以按整数排序。基本上,只需将整数提取到一个新字段中,并对该字段进行排序 标题字段中的数据如下所示(错误): 订购人之后(正确) 谢谢。您可以使用PATINDEX功能: SELECT CAST(SubString(REPLACE(Title,'-',''), PATINDEX('%[0-9]%',REPLACE(Title,'-','')), Len(REPLACE(Title,'-',''))) AS INT
谢谢。您可以使用PATINDEX功能:
SELECT
CAST(SubString(REPLACE(Title,'-',''),
PATINDEX('%[0-9]%',REPLACE(Title,'-','')),
Len(REPLACE(Title,'-','')))
AS INT)
AS [Title Number],*
FROM [Your table-name here]
ORDER BY [Title Number]
编辑:现在将使用连字符
注意:如果标题的非数字部分有数字或连字符(“-”),则不起作用。不完全清楚要按字段的哪一部分排序。你能根据你所显示的输入用预期的输出更新问题吗?还有-在那里你也打算删除它吗?因此,您只需要对标题的数字部分进行排序?条目是否始终采用“测试标题AA xyz ab”的形式?您需要按xyz或xyzab排序?如果有限制,允许的最大连字符数是多少?您的示例不符合您给出的规则。如果排序首先基于最后一个值,那么以
TT TEST 1 UU
开头的行应该排序,所有行都以-1
开头。您给出的解决方案只是有点偏离……下面是它产生的排序:(1)TT TEST 1 UU 25-1(2)TT TEST 1 UU 420-1(3)TT TEST 1 UU 55-46(4)TT TEST 1 UU 600-8-10(5)TT TEST 1 UU 608-20(6)TT TEST 1 UU 750-1(7)TT TEST 750-1(8)TT TEST 80-1我想说你现在可能已经有了修复它的信息了。是的,正如我所说,如果非索引部分有数字(比如你的例子中的1),那么它将不起作用。您可以尝试反转标题(使用REVERSE()),提取数字索引,然后反转索引并将其转换为INT,然后进行排序。让我知道你是否能够这样做..可能做一个存储过程,并使用临时表来做这件事,使脚本看起来不那么混乱..更好的是,颠倒标题。('TT TEST 1 UU 25-1'变为'1-52 UU 1 TSET TT'),将子字符串转换到第一个空格(即'1-52'),将连字符('-')替换为空字符('')(变为'152'),将字符串反转(变为'251'),并将其转换为[Title number](INT))并进行排序。。
TT TEST 80-1
TT TEST 750-1
TT TEST 1 UU 25-1
TT TEST 1 UU 55-46
TT TEST 1 UU 420-1
TT TEST 1 UU 600-8-10
TT TEST 1 UU 608-20
TT TEST 1 UU 750-1
SELECT
CAST(SubString(REPLACE(Title,'-',''),
PATINDEX('%[0-9]%',REPLACE(Title,'-','')),
Len(REPLACE(Title,'-','')))
AS INT)
AS [Title Number],*
FROM [Your table-name here]
ORDER BY [Title Number]