我有一列包含这样的数据。破折号表示同一张发票的多份副本,这些副本必须按升序排序
790711
790109-1
790109-11
790109-2
我必须按此数字以升序对其进行排序,但是由于这是一个varchar字段,因此它按字母顺序进行排序,如下所示
790109-1
790109-11
790109-2
790711
为了解决这个问题,我尝试将-(破折号)替换为空,然后将其强制转换为数字,然后对该数字进行排序
select cast(replace(invoiceid,'-','') as decimal) as invoiceSort...............order by invoiceSort asc
虽然这更好,并像这样排序
invoiceSort
790711 (790711) <-----this is wrong now as it should come later than 790109
790109-1 (7901091)
790109-2 (7901092)
790109-11 (79010911)
有人建议我在-(破折号)上分割发票编号,并在2个分割部分上按顺序排列
喜欢=====> order by split1 asc,split2 asc (790109,1)
我认为这将起作用,但我将如何拆分列。
互联网上的各种分割函数是那些返回表的函数,在这种情况下,我将需要一个标量函数。
还有其他方法可以使用吗?数据显示在网格视图中,默认情况下网格视图不支持对2列进行排序(尽管我可以实现它:)),因此,如果有任何更简单的方法,我会非常好。
编辑 :感谢所有的答案。虽然每个答案都是正确的,但我选择了答案,使我可以将这些列合并到GridView排序中,而对SQL查询的重构最少。
明智地使用的REVERSE
,CHARINDEX
以及SUBSTRING
,可以得到我们想要的东西。我在下面的代码中使用了希望说明的列名来说明正在发生的事情。
设置样本数据:
DECLARE @Invoice TABLE (
InvoiceNumber nvarchar(10)
);
INSERT @Invoice VALUES
('790711')
,('790709-1')
,('790709-11')
,('790709-21')
,('790709-212')
,('790709-2')
SELECT * FROM @Invoice
样本数据:
InvoiceNumber
-------------
790711
790709-1
790709-11
790709-21
790709-212
790709-2
这是代码。我有一个the的感觉,可以简化最终的表达方式。
SELECT
InvoiceNumber
,REVERSE(InvoiceNumber)
AS Reversed
,CHARINDEX('-',REVERSE(InvoiceNumber))
AS HyphenIndexWithinReversed
,SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))
AS ReversedWithoutAffix
,SUBSTRING(InvoiceNumber,1+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS AffixIncludingHyphen
,SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS AffixExcludingHyphen
,CAST(
SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS int)
AS AffixAsInt
,REVERSE(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber)))
AS WithoutAffix
FROM @Invoice
ORDER BY
-- WithoutAffix
REVERSE(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber)))
-- AffixAsInt
,CAST(
SUBSTRING(InvoiceNumber,2+LEN(SUBSTRING(REVERSE(InvoiceNumber),1+CHARINDEX('-',REVERSE(InvoiceNumber)),LEN(InvoiceNumber))),LEN(InvoiceNumber))
AS int)
输出:
InvoiceNumber Reversed HyphenIndexWithinReversed ReversedWithoutAffix AffixIncludingHyphen AffixExcludingHyphen AffixAsInt WithoutAffix
------------- ---------- ------------------------- -------------------- -------------------- -------------------- ----------- ------------
790709-1 1-907097 2 907097 -1 1 1 790709
790709-2 2-907097 2 907097 -2 2 2 790709
790709-11 11-907097 3 907097 -11 11 11 790709
790709-21 12-907097 3 907097 -21 21 21 790709
790709-212 212-907097 4 907097 -212 212 212 790709
790711 117097 0 117097 0 790711
请注意,您实际需要的只是该ORDER BY
子句,其余的只是为了展示我的工作,它是这样的:
int
。幸运的是,我们与SQL Server有所不同,该转换为空字符串提供了零。ORDER BY
(不带任何后缀的数字),然后乘以(后缀的数字值)。这是我们寻求的最终订单。如果SQL Server允许我们说SUBSTRING(value, start)
从那时开始获取字符串,则代码将更加简洁,但是事实并非如此,因此我们不得不说SUBSTRING(value, start,LEN(value))
很多。
我想比较正确的类,而不是字符串,对表进行正确排序。我正在使用TableRowSorter: 我重写了CustomModelTable中的方法getColumnClass,因此根据列的名称获得了正确的类(这是因为类型是通过编程定义的): 这是一个屏幕截图:表格排序错误 最奇怪的是我打印了这些类型: 并返回预期输出(打印上表): 老实说,我不知道我做错了什么。
在我看来最好的情况应该是O(log n),但不确定最坏的情况...也许O(n^2)一次只能匹配一个字母。 谁能给我更多的点子吗?
我有一个数组: 如何根据数组中每个元素中包含的数字对数组进行排序?
问题内容: 我有一个名为 names 的字符串arraylist 。如何按字母顺序对arraylist排序? 问题答案: ArrayList names = new ArrayList (); names =fillNames() // whatever method you need to fill here; Collections.sort(names); http://download.o
问题内容: 我有一个; 我想转换为字符串数组。我该怎么做?有内置的Java函数吗?可以手动完成,但是我正在搜索Java内置函数。 我想要一个数组,其中字符串的每个字符都是一个字符串。像char’n’现在将是存储在数组中的字符串“ n”。 问题答案: 要开始你的作业,请在正则表达式上拆分字符串,该表达式可以为空字符串: 产生数组: 留空的第一条目留给读者练习:-) 注意:在Java 8中,不再包含空
问题内容: 我有默认的字符串比较器(在SortedSet中)有问题。问题是默认比较器不能对包含数字的好的字符串进行排序,即:在集合中,我具有: 自然排序应该与上面类似,但是在集合中我有: 我知道为什么会这样,但是我不知道如何更改它。 问题答案: 尝试使用此比较器,该比较器将删除所有非数字字符,然后将其余字符与数字进行比较: 这是一个测试: 输出: 当数字为小数时(也表示Java 8+样式): 结果