Sql 按包含带破折号的数字的Varchar列排序(1060006-19)

Sql 按包含带破折号的数字的Varchar列排序(1060006-19),sql,sql-server,tsql,Sql,Sql Server,Tsql,给我 SELECT varcharColumn FROM tableA ORDER BY varcharColumn ASC 等 我想要的是 1060006-1 1060006-10 1060006-11 1060006-12 1060006-13 1060006-15 1060006-16 1060006-17 1060006-18 1060006-19 1060006-20 1060006-2 等 Order By可以实现这一点吗?还是我需要更别致的东西 使

给我

SELECT varcharColumn 
FROM tableA
ORDER BY varcharColumn ASC

我想要的是

1060006-1
1060006-10  
1060006-11  
1060006-12  
1060006-13  
1060006-15
1060006-16  
1060006-17  
1060006-18  
1060006-19
1060006-20
1060006-2

Order By可以实现这一点吗?还是我需要更别致的东西

使用此选项可以得到下图中的结果:

1060006-1
1060006-2
1060006-3

这样,你会得到那些破折号在顶部第一;然后,
LEN(XX)
部分是这样的:1-10不出现在1-1之后,而无需转换为十进制。无论如何,您都可以按长度删除订单

如果您只想显示带破折号的thsoe,那么也许您也应该使用where子句

这样,你会得到那些破折号在顶部第一;然后,
LEN(XX)
部分是这样的:1-10不出现在1-1之后,而无需转换为十进制。无论如何,您都可以按长度删除订单


如果您只想显示带破折号的thsoe,那么也许您也应该执行where子句。

本尼欧让我走上正确的道路。最后,我得到了我想要的结果

ORDER BY 
CASE WHEN varcharcolumn like '%-%' THEN 1 ELSE 2 END,
LEN(varcharcolumn), varcharcolumn

本尼欧让我走上了正确的道路。最后,我得到了我想要的结果

ORDER BY 
CASE WHEN varcharcolumn like '%-%' THEN 1 ELSE 2 END,
LEN(varcharcolumn), varcharcolumn

我认为有效的方法是按顺序使用拆分的列

模式:

SELECT varcharcolumn 
FROM TableA
order by LEN(varcharcolumn ) asc, varcharcolumn asc
现在按
-
将varchar列拆分为多个部分,并获得顺序

CREATE TABLE #TAB (VARCHARCOLUMN VARCHAR(20))
INSERT INTO #TAB 
SELECT '1060006-1' 
UNION ALL 
SELECT  '1060006-10' 
UNION ALL 
SELECT  '1060006-11' 
UNION ALL 
SELECT  '1060006-12' 
UNION ALL  
SELECT '1060006-13' 
UNION ALL 
SELECT  '1060006-15' 
UNION ALL 
SELECT  '1060006-16' 
UNION ALL 
SELECT  '1060006-17' 
UNION ALL 
SELECT '1060006-18' 
UNION ALL 
SELECT  '1060006-19' 
UNION ALL 
SELECT  '1060006-20' 
UNION ALL 
SELECT  '1060006-2'
这会回来的

SELECT VARCHARCOLUMN
,CAST(SUBSTRING(VARCHARCOLUMN,1,CHARINDEX('-', VARCHARCOLUMN)-1) AS BIGINT) AS PART1
,CAST(SUBSTRING(VARCHARCOLUMN,CHARINDEX('-', VARCHARCOLUMN)+1,LEN(VARCHARCOLUMN)) AS INT) AS PART2
FROM #TAB
ORDER BY PART1, PART2

我认为最有效的方法是在
orderby

模式:

SELECT varcharcolumn 
FROM TableA
order by LEN(varcharcolumn ) asc, varcharcolumn asc
现在按
-
将varchar列拆分为多个部分,并获得顺序

CREATE TABLE #TAB (VARCHARCOLUMN VARCHAR(20))
INSERT INTO #TAB 
SELECT '1060006-1' 
UNION ALL 
SELECT  '1060006-10' 
UNION ALL 
SELECT  '1060006-11' 
UNION ALL 
SELECT  '1060006-12' 
UNION ALL  
SELECT '1060006-13' 
UNION ALL 
SELECT  '1060006-15' 
UNION ALL 
SELECT  '1060006-16' 
UNION ALL 
SELECT  '1060006-17' 
UNION ALL 
SELECT '1060006-18' 
UNION ALL 
SELECT  '1060006-19' 
UNION ALL 
SELECT  '1060006-20' 
UNION ALL 
SELECT  '1060006-2'
这会回来的

SELECT VARCHARCOLUMN
,CAST(SUBSTRING(VARCHARCOLUMN,1,CHARINDEX('-', VARCHARCOLUMN)-1) AS BIGINT) AS PART1
,CAST(SUBSTRING(VARCHARCOLUMN,CHARINDEX('-', VARCHARCOLUMN)+1,LEN(VARCHARCOLUMN)) AS INT) AS PART2
FROM #TAB
ORDER BY PART1, PART2


我得到了你的预期输出。如果你只想让那些带“-”的出现,你需要的是WHERE子句@jackreill。我认为区别在于你是按长度排序的,当它们的长度相同时,由系统决定。我建议将
、varcharcolumn
添加到
order by
子句中。根据给定的预期输出,很难假设他接下来想要什么。所以我只是想把它留给他下一个订单是必要的。无论如何,我批准了你的编辑。谢谢@SteveLovellI已将您的预期输出显示出来。如果你只想让那些带“-”的出现,你需要的是WHERE子句@jackreill。我认为区别在于你是按长度排序的,当它们的长度相同时,由系统决定。我建议将
、varcharcolumn
添加到
order by
子句中。根据给定的预期输出,很难假设他接下来想要什么。所以我只是想把它留给他下一个订单是必要的。无论如何,我批准了你的编辑。谢谢@史蒂夫洛维尔。。。当然,只要所有字符串都以相同的数字开头(例如1060006),它就可以工作。您是否使用以下数据进行了测试:“1060006-1”、“1060005-1”、“1060006-10”、“1060005-10”?@Thorstenketner破折号后面的数字是版本号,所以它仍然是正确的?1060006-119060006-21060007-119060007-2?@Jack Reilly:不。您显示的内容可以单独按照varcharcolumn的
顺序进行排序。试着用郑重的例子来代替。。。。当然,只要所有字符串都以相同的数字开头(例如1060006),它就可以工作。您是否使用以下数据进行了测试:“1060006-1”、“1060005-1”、“1060006-10”、“1060005-10”?@Thorstenketner破折号后面的数字是版本号,所以它仍然是正确的?1060006-119060006-21060007-119060007-2?@Jack Reilly:不。您显示的内容可以单独按照varcharcolumn的
顺序进行排序。请尝试Trung Duong的示例。如果您对两个单独的字符串感兴趣(您希望将字符串“1060006-2”视为两个数字1060006和2或两个字符串“1060006”和“02”)表示这最好是两个单独的列。您可能希望在表设计中改变这一点,像这里需要的查询将变得非常简单。我同意,因为破折号后面的数字是版本号的关键。但是太多的事情取决于它目前的设置方式,我认为我没有时间去改变它。这是一种常见的情况。不幸的是,将来依赖它的东西会更多,所以情况会越来越糟。一个选项可能是引入单独的列,并将合成的数字设置为计算列。如果您对两个单独的字符串感兴趣(您希望将字符串“1060006-2”视为两个数字1060006和2或两个字符串“1060006”和“02”)表示这最好是两个单独的列。您可能希望在表设计中改变这一点,像这里需要的查询将变得非常简单。我同意,因为破折号后面的数字是版本号的关键。但是太多的事情取决于它目前的设置方式,我认为我没有时间去改变它。这是一种常见的情况。不幸的是,将来依赖它的东西会更多,所以情况会越来越糟。一个选项可能是引入单独的列,并将合成的数字作为计算列。