我的表格中有一个bigint(ProductSerial)类型的列。我需要使用like运算符通过Product serial过滤表。但我发现,像运算符一样不能用于整数类型。
是否还有其他方法(我不想使用=
运算符)。
答案 0 :(得分:12)
如果您必须使用LIKE
,则可以将您的号码转换为char
/ varchar
,并对结果执行LIKE
。这是非常低效的,但由于LIKE
具有杀死索引的高潜力,它可能适用于您的场景:
... AND CAST(phone AS VARCHAR(9)) LIKE '%0203'
如果您希望使用LIKE
来匹配数字的开头或结尾,可以使用整数除法和模数运算符来提取数字。例如,如果您想要所有以407
开头的九位数字,请搜索
phone / 1000000 = 407
答案 1 :(得分:2)
虽然我在派对上迟到了,但是我想添加我用来匹配任何数字类型的前N个给定数字(在示例中为123)的方法柱:
SELECT * FROM MyTable WHERE MyColumn / POWER(10, LEN(MyColumn) - LEN(123)) = 123
该技术类似于@dasblinkenlight的技术,但无论目标列值的位数如何,它都能正常工作。如果您的列包含不同长度的数字并且您不想使用CAST + LIKE方法(或计算列),则这是一种可行的解决方法。
有关该(以及其他LIKE解决方法)的其他详细信息,请查看我就此主题撰写的this blog post。
答案 2 :(得分:1)
您可以更改Field PhoneNumbers并将其存储为String然后使用Like您可以更改您的表以便您可以使用LIKE语句,如果您仍想使用BIGint作为您的电话号码,则无法获得确切的电话不使用的数字=您可以使用的方法是查找范围内的数字的Between方法。
对于编辑过的问题:我认为你应该使用= sign作为他们的ID,或者将Int转换为String然后使用Like。
答案 3 :(得分:0)
原始问题与电话号码有关。 OP已编辑它以引用序列号。这个答案仅涉及原始问题。
我的建议是避免首先将您的电话号码存储为整数,因此不会出现问题。我的电话号码在国际上的格式为:
+44 7844 51515
将它存储为整数在这里没有任何意义,因为你永远不需要对它进行任何数学运算,你将失去领先优势。在英国,它是:
07844 51515
因此将其存储为整数将失去其前导零。除非你有一个非常非常特定的要求将它存储为一个整数,否则你会更好地将它存储为一个字符串。
[注意:实际上不是我的电话号码]
答案 4 :(得分:0)
如果您可以控制数据库,则可以添加计算列以将整数值复制到字符串:
ALTER TABLE MyTable
ADD CalcCol AS (CAST(ProductSerial AS VARCHAR)) PERSISTED
并查询如下:
SELECT *
FROM MyTable
WHERE ProductSerial LIKE '%2548%'
这会将计算移动到插入/更新,并且仅在插入/更新的行上移动,而不是为每个查询转换每一行。 如果对列进行了大量更新,则可能会出现问题,因为这会给这些列增加非常小的开销。
可能有一种方法可以使用模数以数学方式进行,但这需要大量的工作和测试。