像整数运算符一样

时间:2013-08-27 09:59:04

标签: sql sql-like

我的表格中有一个bigint(ProductSerial)类型的列。我需要使用like运算符通过Product serial过滤表。但我发现,像运算符一样不能用于整数类型。

是否还有其他方法(我不想使用=运算符)。

5 个答案:

答案 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%'

这会将计算移动到插入/更新,并且仅在插入/更新的行上移动,而不是为每个查询转换每一行。 如果对列进行了大量更新,则可能会出现问题,因为这会给这些列增加非常小的开销。

可能有一种方法可以使用模数以数学方式进行,但这需要大量的工作和测试。