sql-server - 在 SQL Server 表中匹配具有可变数量的前导零的字段

标签 sql-server database tsql

我有一种情况,我的传入数据值可能有也可能没有前导零。我需要将其与 SQL Server 表中的字段/行相匹配。 SQL Server 数据库中的字段值也可能有也可能没有前导零。

所以,我可能会:

  • 传入 = 5042800138
    db中的值可以是5042800138、05042800138、005042800138、0005042800138中的任意一个

  • 或者传入的可能是 005042800138
    db中的值可以是5042800138、05042800138、005042800138、0005042800138中的任意一个

我想出的解决方案是(始终)去除传入数据的前导零并使用 SQL,如下例所示:

-- this simulates the incoming value to check
-- i strip out the leading zeroes.
declare @tryUPC as varchar(40)
set @tryUPC = '5042800138'

-- try to find it in the database and ignore leading zeroes
select prod_uid, prod_partno, prod_upc
from products as p
where (prod_upc = @tryUPC) or 
   (
   len(prod_upc) > len(@tryUPC)
   and right(prod_upc, len(@tryUPC)) = @tryUPC
   and stuff(prod_upc, 1, len(prod_upc) - len(@tryUPC), '0') = prod_upc
   )

这似乎可行。我的问题是,我错过了什么吗? SQL Server 有更好的方法来处理这个问题吗?我正在使用 SQL Server 2005。

我,

不要

最佳答案

只是另一个倾向(更正数据是最好的,但接受的答案也是一个不错的解决方法):添加一个持久的索引计算列“actualUPC”,它是一种字符类型,使用正确数量的前导零计算。示例:

如果“真实”代码应该是 12 位数字,则创建一个计算列,如下所示

 right( '000000000000' + originalColumn, 12 )

这样输入数据实际上得到了更正,然后正确地建立了索引,并且可以使用索引进行搜索。

查询时,还要填充输入以匹配,作为查询中的常量。

不过,在变得太疯狂之前,请检查对索引计算列的限制。

像这样的顺便说一句代码(邮政编码、序列号、ssn 等)应始终存储为文本数据,前导零,并且永远不要存储为整数或数字类型。从一个在邮政编码 01033 长大的人那里拿来的。

关于sql-server - 在 SQL Server 表中匹配具有可变数量的前导零的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2209437/

相关文章:

sql-server - SQL Server 异常 : TCP Provider, 错误:0 - 指定的网络名称不再可用

mysql - (LocalDb)\Server_name 在 Visual Studio 2017 中显示连接字符串中的错误

java - 更新数据库连接java

sql - 来自局部变量的 MAXRECURSION 值

sql-server - sa密码自动保持自动更改

arrays - 如何使用 SQL Server 解析嵌套 JSON 数组

mysql - 触发器中的语句不是 "picking up"其Where子句中的条件

java - 从另一个数据库访问方法中调用数据库访问方法

sql-server - 用于获取 SQL XML 值的 XPath

SQL ORDER BY - 将具有相同值的列分组