【问题标题】:How to simplify a multiple cast MySql select statement?如何简化多重转换 MySql 选择语句?
【发布时间】:2015-10-01 05:55:30
【问题描述】:

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

【问题讨论】:

  • 你可以获取SUBSTRING(col1, 0, 3),然后使用WHERE NOT IN(. . . )

标签: mysql sql select


【解决方案1】:

您可以使用子查询:

SELECT COUNT(*)
FROM
( 
  SELECT CAST(col1 AS VARCHAR(10)) AS col1
  FROM tablename
) AS t
WHERE t.col1 NOT LIKE '558%'
...

【讨论】:

    【解决方案2】:

    您的问题的直接答案是强制转换在 MySQL 中是隐式的,因此 col1 NOT LIKE '556%' 等同于您正在做的事情。

    最好避免在WHERE 子句中使用引用列名的函数,因为这会禁用索引并要求对表中的每一行进行评估。我假设您已经意识到这一点,因为您提到您仍然“必须进行数学运算”。

    如果您确实知道数字的大小,那么更正确的查询将是......

    WHERE (col1 < 556 * 100000 OR col1 > 556 * 100000)
      AND ...
    

    如果根据您正在做的事情在逻辑上是正确的,那么这是一个更好的解决方案,因为优化器只会执行一次数学运算,将其转换为常量,而不是每行执行一次。

    另请注意,如果您确实知道数字的小数位数,那么LIKE '556______' 也比使用% 在逻辑上更有效,因为_ 只匹配一个字符,而% 匹配零个或多个字符。

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 2016-05-07
      • 1970-01-01
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      相关资源
      最近更新 更多