我有一个表Invoices
,其中InvoiceNumber
为varchar(32)
客户可以修改其发票格式,例如:INV00001
,000001
,I00001
等,因此在配置后,每次创建该程序时,发票会增加发票编号,因此可以唯一
我想搜索发票,但要使用从2到10的整数值,例如:
SELECT * FROM Invoices WHERE InvoiceNumber >= '2' AND InvoiceNumber <= '10'
如何使用varchar
字段来做到这一点?
编辑:客户可以根据需要设置格式,其中大多数不会更改,大多数使用三个字符,其余数字如:INV0000001
这不是我的数据库,我只是为此应用开发一个插件,无法更改数据库中的任何内容
InvoiceNumber
-------------
INV00260
INV00261
INV00262
INV00263
INV00264
INV00265
INV00266
INV00267
INV00268
客户要使用介于之间的值来搜索发票,假设他要搜索INV00262
和INV00267
之间的发票,客户想要按数字进行搜索,结果应为:>
INV00262
INV00263
INV00264
INV00265
INV00266
INV00267
但是使用整数值,例如:WHERE InvoiceNumber >= '262' AND InvoiceNumber <= '267'
答案 0 :(得分:0)
假设您的InvoceNmber包含仅存储为字符串..的有效整数值。
您可以将字符串强制转换为INT,例如:
SELECT * FROM Invoices WHERE cast(InvoiceNumber AS INT)>= 2 AND InvoiceNumber <= 10
答案 1 :(得分:0)
您可以尝试使用SUBSTRING
和LEN
函数来获取最后两个数字。然后CAST
转换为整数。
SELECT *
FROM Invoices
WHERE CAST(SUBSTRING( InvoiceNumber, LEN(InvoiceNumber) - 1, 2 ) AS INT) >= 2
AND CAST(SUBSTRING( InvoiceNumber, LEN(InvoiceNumber) - 1, 2 ) AS INT) <= 10
编辑
您需要解析发票编号的一部分并将其转换为int以进行比较。
例如,您的示例数据发票编号由INV
创建,并且五位数组合成一个发票编号。看起来像INV00001
您可以使用SUBSTRING
函数从第4位到字符串末尾检索一个字符串,然后将获得00001
个数字,不包括数字。
最后使用CAST
至INT
DECLARE @FromInv VARCHAR(32) = 'INV00262';
DECLARE @ToInv VARCHAR(32) = 'INV00267';
SELECT *
FROM Invoices
WHERE
CAST(SUBSTRING( InvoiceNumber, 4, LEN(@FromInv) - 3) AS INT) >= CAST(SUBSTRING(@FromInv, 4, LEN(@FromInv) - 3) AS INT)
AND
CAST(SUBSTRING( InvoiceNumber, 4, LEN(@FromInv) - 3) AS INT) <= CAST(SUBSTRING(@ToInv, 4, LEN(@FromInv) - 3) AS INT)
[结果] :
| InvoiceNumber |
|---------------|
| INV00262 |
| INV00263 |
| INV00264 |
| INV00265 |
| INV00266 |
| INV00267 |
答案 2 :(得分:0)
我相信更有效地使用索引可以这样工作。将查询计划与可接受的答案进行比较,看是否有很大差异。
select * from T
where InvoiceNumber between
'INV' + right('0000' + cast(<start> as varchar(5)) and
'INV' + right('0000' + cast( <end> as varchar(5));
这也更加简单,参数仅需要被引用一次,这可以在客户端代码中有所作为。