У меня есть запись в таблице вроде:
aaaa bbbbb_ ccccc_1
ИЛИ ЖЕ
gggg jjjjj_fffff _34
Обратите внимание на пробелы и подчеркивания, а также на подчеркивание и пробелы. Обратите внимание, что формат строки и числа может отличаться.
Я хотел бы выбрать и обновить эту информацию в базе данных с помощью однострочного запроса.
Что я сделал до сих пор:
$update = " UPDATE table
SET SKU = REPLACE((
SELECT SKU
FROM table
WHERE SKU LIKE '%\_ %' OR SKU LIKE '% \_%'
),replace('_ ', ' _'),replace('_', '_'))";
Переведено: Обновить таблицу SKU = заменить из варианта выбора 1 (_) или варианта 2 (_) простым _
Вопрос: Этот запрос не выполняется ... почему?
РЕДАКТИРОВАТЬ 1:
Здесь - это ссылка, по которой вы можете увидеть все записи, содержащие "_" ИЛИ "_". Я использую это:
SELECT SKU FROM table WHERE SKU LIKE '%\_ %' OR SKU LIKE '% \_%'
Используя предложение Тима, в приведенном выше запросе не перечислено более 700 записей, вместо этого отображается 530. Таким образом, запрос Тима работал у немногих, но не у всех.
Пожалуйста, отредактируйте свой вопрос и покажите нам актуальные данные. Спасибо.
@TimBiegeleisen Это сделал -> Редактировать 1






Почему бы просто не вложить два вызова в REPLACE:
UPDATE table
SET SKU = REPLACE(REPLACE(SKU, '_ ', '_'), ' _', '_')
WHERE SKU REGEXP ' _|_ ';
Обратите внимание, что MySQL на самом деле не поддерживает никаких замен регулярных выражений, поэтому REPLACE почти настолько хорош, насколько это возможно (хотя мы могли использовать REGEXP в предложении WHERE).
Редактировать:
Чтобы проверять, что обновление фактически удалило / исправило все неверные данные, вы можете попробовать использовать следующий запрос выбора:
SELECT *
FROM table
WHERE SKU REGEXP ' _|_ ';
Обратите внимание, что этот запрос должен возвращать результаты нет, потому что если это так, это означает, что логика обновления не была полностью правильной.
Хороший вопрос! Мне нравится, как вы это написали, но, к сожалению ... у меня было 734 записи t обновлено ... после выполнения вышеуказанного запроса у меня все еще осталось 530 И поверьте мне, есть еще те же записи, которые нужно обновить
Тогда, возможно, MySQL - не лучшее место для такой очистки данных. Я не думаю, что здесь действительно поможет индекс.
Я использовал Select SKU, который я написал выше после выполнения вашего запроса, и вернул мне 530 записей с "" или же ""
Я не понимаю, как это могло происходить. С каких данных вообще начинается текст or?
Понятно ... тогда я экспортирую массив из запроса select и сделаю еще одно обновление после некоторого анализа.
Он настроен на отображение этих записей с "" ИЛИ ЖЕ "" внутри
В комментариях не видно подчеркивания?
@OzZie Проверить это демо, который содержит образцы двух типов SKU, которые появляются в вашем фактическом наборе данных. Как видите, запрос правильно улавливает их обоих. Итак, я не знаю, в чем ваша проблема.
@OzZie Ваше заявление SELECT неверно. Вы должны просто делать SELECT *, потому что замены уже произошли. Проверьте мой обновленный ответ.
ты прав ... извини! :( Принял ответ с большим спасибо!
Действительно запутанный запрос. Похоже, что условие WHERE должно быть в родительском запросе, а не во вложенном запросе, и почему вы вызываете замену во второй и третий раз?