是否有更好的方法来编写此查询

时间:2014-11-17 10:41:06

标签: mysql sql

我正在尝试搜索和更新记录,该记录从哪个部分开始,或者以范围落下。

我做了一个查询,其中值以特定数字开头。我无法弄清楚如何使用范围进行操作。

例如,我想用"更新products_ean中的以下值"

255
201-230   ---> starts with 201,202,203 ...230
236
980-990   ---> starts with 980.981,982 ...990

我写了下面的查询,但是当它必须搜索超过100k的记录时,不确定它是否有效。它不适用于范围。

UPDATE products SET products_ean ="" 
where products_ean like "200%" 
OR products_ean like "020%" 
OR products_ean like "023%" 
OR products_ean like "027%" 
OR products_ean like "042%" 
OR products_ean like "221%" 
OR products_ean like "209%" 
OR products_ean like "041%" 
OR products_ean like "049%" 
OR products_ean like "026%" 
OR products_ean like "025%" 
OR products_ean like "299%";

5 个答案:

答案 0 :(得分:7)

无论如何,这将是一个全表扫描,因此您可以使用products_ean上的函数而不会降低性能。这就是说,你可以让查询更具可读性,但可能不会更快。但是,您仍然可以尝试是否更快,取三个前导数字并进行比较:

UPDATE products SET products_ean = '' 
where left(products_ean,3) in ('200', '020', '027', ...);

如果您发现它更具可读性,您甚至可以使用范围:

UPDATE products SET products_ean = '' 
where left(products_ean,3) = '255'
   or left(products_ean,3) between '201' and '230'
...

答案 1 :(得分:1)

也许你可以尝试这个不确定性能而不是代码..如果你的ean是一个字符串字段。你可以试试这个

UPDATE products SET products_ean ="" 
where (left(products_ean,3) between 201 and 230) or
(left(products_ean,3) between 980 and 990) or

PS:你可能想要施展这个领域。

答案 2 :(得分:1)

我不认为它会更快,但它是另一种选择:

寻找:

SELECT * 
FROM products
WHERE products_ean
REGEXP  '^(200|020|023|027|042|221|209|041|049|026|025|299)'

替换:

UPDATE products SET products_ean = ''
WHERE products_ean
REGEXP  '^(200|020|023|027|042|221|209|041|049|026|025|299)'

注意:它不会使用索引

答案 3 :(得分:1)

你可以试试这个

UPDATE products SET products_ean = " "
WHERE STRCMP(products_ean, '200') >= 0 AND STRCMP(products_ean, '220') <= 0

答案 4 :(得分:-2)

你可以尝试包含的内容, 它必须像:

WHERE CONTAINS(t.products_ean, '"200*" OR "020*" OR "023*"')