SQL Server在varchar列中的数字之间进行搜索



我有一个表Invoices,其中InvoiceNumber作为varchar(32)

客户可以修改他们的发票格式,如:INV00001000001I00001等,因此在配置时,每次创建发票时,程序都会增加发票编号,使其成为唯一的

我想搜索发票,但使用从2到10的整数值,如下所示:

SELECT * FROM Invoices WHERE InvoiceNumber >= '2' AND InvoiceNumber <= '10'

如何使用varchar字段来完成此操作?

编辑:客户按照自己的意愿设置格式,大多数客户从不更改,大多数客户使用三个字符,其余数字如:INV0000001

这不是我的数据库,我只是在为这个应用程序开发一个插件,不能更改DB 中的任何内容

InvoiceNumber
-------------
INV00260
INV00261
INV00262
INV00263
INV00264
INV00265
INV00266
INV00267
INV00268

客户想使用值之间的搜索发票,假设他想在INV00262INV00267之间搜索发票,客户想按数字搜索,结果应该是:

INV00262
INV00263
INV00264
INV00265
INV00266
INV00267

但使用整数值,如:WHERE InvoiceNumber >= '262' AND InvoiceNumber <= '267'

假设InvoceNmember包含仅存储为字符串的有效整数值。。

你可以把字符串转换为INT,例如:

SELECT * FROM Invoices WHERE cast(InvoiceNumber AS INT)>= 2 AND InvoiceNumber <= 10

我相信更有效地使用索引会以这种方式工作。将查询计划与接受的答案进行比较,看看是否有很大的差异。

select * from T
where InvoiceNumber between
'INV' + right('0000' + cast(<start> as varchar(5)) and
'INV' + right('0000' + cast( <end>  as varchar(5));

它也简单了一点,参数只需要引用一次,这可以在客户端代码中产生影响。

最新更新