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

时间:2018-08-04 18:50:12

标签: sql sql-server-2008

我有一个表Invoices,其中InvoiceNumbervarchar(32)

客户可以修改其发票格式,例如:INV00001000001I00001等,因此在配置后,每次创建该程序时,发票会增加发票编号,因此可以唯一

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

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

如何使用varchar字段来做到这一点?

编辑:客户可以根据需要设置格式,其中大多数不会更改,大多数使用三个字符,其余数字如:INV0000001

这不是我的数据库,我只是为此应用开发一个插件,无法更改数据库中的任何内容

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

客户要使用介于之间的值来搜索发票,假设他要搜索INV00262INV00267之间的发票,客户想要按数字进行搜索,结果应为:

INV00262
INV00263
INV00264
INV00265
INV00266
INV00267

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

3 个答案:

答案 0 :(得分:0)

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

您可以将字符串强制转换为INT,例如:

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

答案 1 :(得分:0)

您可以尝试使用SUBSTRINGLEN函数来获取最后两个数字。然后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

sqlfiddle

编辑

您需要解析发票编号的一部分并将其转换为int以进行比较。

例如,您的示例数据发票编号由INV创建,并且五位数组合成一个发票编号。看起来像INV00001

您可以使用SUBSTRING函数从第4位到字符串末尾检索一个字符串,然后将获得00001个数字,不包括数字。

最后使用CASTINT

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)

sqlfiddle

[结果]

| 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));

这也更加简单,参数仅需要被引用一次,这可以在客户端代码中有所作为。