如何简化多重转换MySql select语句?

时间:2015-10-01 05:55:30

标签: mysql sql select

我正在尝试执行具有许多条件的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子句中的每个项目,这导致了如何简化语句的相同问题?

2 个答案:

答案 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______'在逻辑上比使用%更有效,因为_只匹配一个字符,其中%匹配零或更多。