我正在尝试执行具有许多条件的MySql选择,但是想要对作为整数数据类型的列执行字符串比较。有没有办法在没有必要在where子句中的每个条件下将列转换为varchar?
SELECT COUNT(*)
FROM tablename
WHERE CAST(col1 AS VARCHAR(10)) NOT LIKE '558%'
AND CAST(col1 AS VARCHAR(10)) NOT LIKE '566%'
AND CAST(col1 AS VARCHAR(10)) NOT LIKE '567%'
AND CAST(col1 AS VARCHAR(10)) NOT LIKE '568%'
AND CAST(col1 AS VARCHAR(10)) NOT LIKE '569%'
AND CAST(col1 AS VARCHAR(10)) NOT LIKE '579%';
在你问我为什么不进行整数比较之前:我也可以只使用普通整数比较,而不是转换为varchar,但是我仍然需要执行数学运算,即col1 / 100000,对于where子句中的每个项目,这导致了如何简化语句的相同问题?
答案 0 :(得分:0)
您可以使用子查询:
SELECT COUNT(*)
FROM
(
SELECT CAST(col1 AS VARCHAR(10)) AS col1
FROM tablename
) AS t
WHERE t.col1 NOT LIKE '558%'
...
答案 1 :(得分:0)
你的问题的直接答案是强制转换是在MySQL中隐含的,因此col1 NOT LIKE '556%'
等同于你正在做的事情。
最好避免使用引用WHERE
子句中列名的函数,因为这会禁用索引的使用并要求计算表中的每一行。我假设您已经意识到这一点,因为您提到您仍然需要进行数学运算。"
如果您确实知道数字的比例,那么更正确的查询将是......
WHERE (col1 < 556 * 100000 OR col1 > 556 * 100000)
AND ...
如果根据你正在做的事情在逻辑上是正确的,那么它是一个更好的解决方案,因为优化器只会做一次数学运算,将它们转换成常量,而不是每行做一次。
另请注意,如果您确实知道数字的比例,那么LIKE '556______'
在逻辑上比使用%
更有效,因为_
只匹配一个字符,其中%
匹配零或更多。