Обновление mysql с использованием REPLACE и LIKE

У меня есть запись в таблице вроде:

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. Таким образом, запрос Тима работал у немногих, но не у всех.

Действительно запутанный запрос. Похоже, что условие WHERE должно быть в родительском запросе, а не во вложенном запросе, и почему вы вызываете замену во второй и третий раз?

Devon 16.07.2018 15:50

Пожалуйста, отредактируйте свой вопрос и покажите нам актуальные данные. Спасибо.

Tim Biegeleisen 16.07.2018 16:01

@TimBiegeleisen Это сделал -> Редактировать 1

OzZie 16.07.2018 16:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
457
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 И поверьте мне, есть еще те же записи, которые нужно обновить

OzZie 16.07.2018 15:57

Тогда, возможно, MySQL - не лучшее место для такой очистки данных. Я не думаю, что здесь действительно поможет индекс.

Tim Biegeleisen 16.07.2018 15:58

Я использовал Select SKU, который я написал выше после выполнения вашего запроса, и вернул мне 530 записей с "" или же ""

OzZie 16.07.2018 15:58

Я не понимаю, как это могло происходить. С каких данных вообще начинается текст or?

Tim Biegeleisen 16.07.2018 15:59

Понятно ... тогда я экспортирую массив из запроса select и сделаю еще одно обновление после некоторого анализа.

OzZie 16.07.2018 15:59

Он настроен на отображение этих записей с "" ИЛИ ЖЕ "" внутри

OzZie 16.07.2018 16:00

В комментариях не видно подчеркивания?

OzZie 16.07.2018 16:01

@OzZie Проверить это демо, который содержит образцы двух типов SKU, которые появляются в вашем фактическом наборе данных. Как видите, запрос правильно улавливает их обоих. Итак, я не знаю, в чем ваша проблема.

Tim Biegeleisen 16.07.2018 16:13

@OzZie Ваше заявление SELECT неверно. Вы должны просто делать SELECT *, потому что замены уже произошли. Проверьте мой обновленный ответ.

Tim Biegeleisen 16.07.2018 16:34

ты прав ... извини! :( Принял ответ с большим спасибо!

OzZie 17.07.2018 07:54

Другие вопросы по теме