我的数据是这样的
<400
1000-1200
1200-1400
1400-1600
1600-1800
400-600
600-700
700-800
800-1000
我想要这样
<400
400-600
600-700
700-800
800-1000
1000-1200
1200-1400
...
order by LEFT(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC])-1),
CONVERT(INT, SUBSTRING(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC]), LEN(WC.[WGHT_CLAS_DESC])))
这是我在SQL Server中使用但不起作用的代码
答案 0 :(得分:2)
试试这个:
DECLARE @DataSource TABLE
(
[Column] VARCHAR(32)
);
INSERT INTO @DataSource ([Column])
VALUES ('<400')
,('1000-1200')
,('1200-1400')
,('1400-1600')
,('1600-1800')
,('400-600')
,('600-700')
,('700-800')
,('800-1000');
SELECT [Column]
,TRY_CONVERT(INT, SUBSTRING([Column], 0, CHARINDEX('-', [Column])))
FROM @DataSource
ORDER BY TRY_CONVERT(INT, SUBSTRING([Column], 0, CHARINDEX('-', [Column])));
请注意,SQL Server 2012
后可以使用TRY_CONVERT,因此如果您使用的是早期版本,则可以使用CAST
:
ORDER BY CAST(SUBSTRING([Column], 0, CHARINDEX('-', [Column])) AS INT)
答案 1 :(得分:0)
我认为你的意思是:
ORDER BY LEFT(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC])-1) DESC,
CONVERT(INT, SUBSTRING(WC.[WGHT_CLAS_DESC], PATINDEX('%[0-9]%', WC.[WGHT_CLAS_DESC]), PATINDEX('%[^0-9]%', WC.[WGHT_CLAS_DESC])-1))
答案 2 :(得分:0)
试试这个:
declare @t table(val varchar(max))
insert into @t
select '<400'
union select '1000-1200'
union select '1200-1400'
union select '1400-1600'
union select '1600-1800'
union select '400-600'
union select '600-700'
union select '700-800'
SELECT rn=row_number() over( order by StartNumber,EndNumber),StartNumber,EndNumber Val
FROM (
select
CAST(RIGHT(val,LEN(val)-CHARINDEX('-',val)) as int) EndNumber,
CAST(REPLACE(val,'-'+RIGHT(val,LEN(val)-CHARINDEX('-',val)),'') as int) StartNumber,
val
from (
SELECT REPLACE(Val,'<','0-') As Val from @t
) a
)Data
当然,我建议在SQL2012之后使用TRY_CONVERT