簡體   English   中英

是否有更好的方法來編寫此查詢

[英]is there a better way to write this query

我正在嘗試搜索和更新記錄,其中包含一個部分數字或一個范圍的下降。

我做了一個查詢,其中值以特定數字開頭。 我無法弄清楚如何使用范圍來做到這一點。

例如,我想用products“更新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%";

無論如何,這將是一個全表掃描,因此您可以在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'
...

也許你可以嘗試這個不確定性能而不是代碼..如果你的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:你可能想要施展這個領域。

我不認為它會更快,但它的另一種選擇:

尋找:

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)'

注意:它不會使用索引

你可以試試這個

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

你可以嘗試在哪里包含,它必須像:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM