【问题标题】:Performing a LIKE comparison on an INT field对 INT 字段执行 LIKE 比较
【发布时间】:2021-11-11 23:45:46
【问题描述】:

我对 SQL 还很陌生,我试图获取与用户输入的产品 ID 匹配的产品的完整列表。比如:

SELECT ProductID, ProductName FROM Products WHERE ProductID LIKE '%15%'

我希望它列出所有匹配的产品,例如: 15、150、2154等

不幸的是,我遇到了问题,因为 productID 字段是 INT 而不是字符串。有没有一些相对简单的方法来解决这个问题?

【问题讨论】:

  • 如果“正确”的答案是将值转换/转换为文本,则应更改表格以将列永久转换为文本。这很直观,因为您不需要对产品标识符进行数学运算。

标签: mysql sql


【解决方案1】:

你可以将CAST字段转成字符串:

 ... WHERE CAST(ProductID as CHAR) LIKE '%15%'

这对性能非常不利,因为 mySQL 无法使用它为 INT 列创建的任何索引。但是,LIKE 总是很慢,即使在 varchar 字段上完成时也是如此:没有办法让索引加速 LIKE 查询。

可能值得拥有第二个 varchar 列来反映 int 列的值并对该列进行 LIKE - 您必须进行基准测试以确定它是否有任何好处。

【讨论】:

  • 使用 CAST 比使用 CONVERT 快吗?
  • @Maxx 是同一个函数的同义词,所以没有区别。
  • {"表达式包含未定义的函数调用 CAST()。"} 是我所看到的 :(
  • @Maxx SELECT ProductID, ProductName FROM Products WHERE CAST(ProductID as CHAR) LIKE '%15%' 应该可以工作。
  • SQL Server 管理器?那么这是在 SQL Server 还是 MySQL 上?另外,发布您的 C# 代码。
【解决方案2】:

您可以使用CONVERT(ProductID, CHAR(16)) AS ProductIDconvert int 转换为字符串,然后使用LIKE。所以在你的情况下,它会是

SELECT ProductID, ProductName FROM Products
WHERE CONVERT(ProductID, CHAR(16)) LIKE '%15%'

您应该记住,该查询将在没有任何索引支持的情况下进行全表扫描。因此,这将非常昂贵且耗时。

【讨论】:

  • {"表达式包含未定义的函数调用 CHAR()。"} 就是我所看到的。
  • 您使用的是哪个 MySQL 版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多