使用字母数字和特殊字符值对varchar排序

问题描述 投票:1回答:2

我有一个发票编号字段为varchar(20)

我的选择查询为

SELECT Row_Number() OVER(ORDER BY case isnumeric(invoice_number) 
                                       when 1 then convert(bigint,invoice_num)
                                       else 99999999999999999999 
                                  end) As id, 
       name,
       submit_date,
       invoice_number,
       invoice_total,
       currency_code
FROM vw_invoice_report

在某些情况下可以正常工作,但我无法使其适用于以下所有的invoice_number

f8ad2a28ddad4f6aa4df
0B849D69741145379079
20190313176617593442
ATOctober2000Promise
00100001010000000061
E285567EF0D0885E9160
SC1805000123000293
1999bernstyin2010
20600006307FFGMG
REVISED INVOICE F...
1111-2222(changzhou)
667339, 667340, 6...
18.12733562GAGA L...
IN-US01235055    ...
SSR-USD/426/2019 - 2
Nanny; Park Doug
184034
376840
376847-1
72692
72691
72690
72689

正在获取上述某些数据的Error converting data type varchar to bigint.,有人可以帮我使其适用于上述测试数据吗?

sql sql-server sql-server-2005
2个回答
0
投票
row_number() over (order by (case when isnumeric(invoicenumber) = 1 then len(invoicenumber) else 99999 ), invoicenumber )

0
投票
SELECT Row_Number() OVER(ORDER BY case isnumeric(invoice_number) when 1 then REPLACE(STR(invoice_number, 20), ' ', '0') else '99999999999999999999' end) As id,

SQLFiddle上的演示(也显示转换后的发票号)

© www.soinside.com 2019 - 2024. All rights reserved.