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”)表示这最好是两个单独的列。您可能希望在表设计中改变这一点,像这里需要的查询将变得非常简单。我同意,因为破折号后面的数字是版本号的关键。但是太多的事情取决于它目前的设置方式,我认为我没有时间去改变它。这是一种常见的情况。不幸的是,将来依赖它的东西会更多,所以情况会越来越糟。一个选项可能是引入单独的列,并将合成的数字作为计算列。