2014-11-17 4 views
5

Я пытаюсь найти и обновить запись, которая начинается с частичного числа или падения с диапазоном.есть лучший способ написать этот запрос

Я выполнил запрос, который работает там, где значения начинаются с определенного числа. Я не могу понять, как это сделать с диапазоном.

, например, я хочу, чтобы обновить следующие значения в products_ean с «»

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

Я написал следующий запрос, который работает, но не уверен, если это ЭФФЕКТИВНАЯ espcialy, когда он имеет к поиску более 100к записей. Он не работает с диапазоном.

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%"; 
+0

Есть ли мотивация с помощью строкового поля для EAN-кодов? Моя идея состояла бы в том, чтобы добавить столбец, представляющий искомый номер, и сделать запрос диапазона на нем, а не на использование понравившихся – mkubacki

+0

Если производительность является проблемой: денормализация (например, добавление столбцов) – Peter

+0

@fallenPhantasm Коды EAN могут иметь разную длину, поэтому это будет делать диапазоны проверки более сложный. – GolezTrol

ответ

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' 
... 
-2

вы можете попробовать, где содержится, оно должно быть как:

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

Как я могу справиться с диапазонами ..201-230 .. Мне нужно удалить всю запись, которая начинается с 201, 202,203..230 – naf

1

может быть, вы могли бы попробовать это не уверены о производительности, но меньше кода .. если ваш ЕАН это поле строка. вы можете попробовать это

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: вы можете выбрать поле.

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

примечание: он не будет использовать индексы

1

Вы можете попробовать это

UPDATE products SET products_ean = " " 
WHERE STRCMP(products_ean, '200') >= 0 AND STRCMP(products_ean, '220') <= 0 
Смежные вопросы