我有一个表Invoices
,其中InvoiceNumber
作为varchar(32)
客户可以修改他们的发票格式,如:INV00001
、000001
、I00001
等,因此在配置时,每次创建发票时,程序都会增加发票编号,使其成为唯一的
我想搜索发票,但使用从2到10的整数值,如下所示:
SELECT * FROM Invoices WHERE InvoiceNumber >= '2' AND InvoiceNumber <= '10'
如何使用varchar
字段来完成此操作?
编辑:客户按照自己的意愿设置格式,大多数客户从不更改,大多数客户使用三个字符,其余数字如:INV0000001
这不是我的数据库,我只是在为这个应用程序开发一个插件,不能更改DB 中的任何内容
InvoiceNumber
-------------
INV00260
INV00261
INV00262
INV00263
INV00264
INV00265
INV00266
INV00267
INV00268
客户想使用值之间的搜索发票,假设他想在INV00262
和INV00267
之间搜索发票,客户想按数字搜索,结果应该是:
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));
它也简单了一点,参数只需要引用一次,这可以在客户端代码中产生影响。