#mysql #sql
#mysql #sql
Вопрос:
Я использую это для поиска и замены строк в MySQL:
UPDATE products
SET prodname = REPLACE(prodname, " S", "'S")
Продукты содержат такие строки, как «TYLENOL TABS 100 S», которые я хотел бы преобразовать в «TYLENOL TABS 100».
Однако использование приведенного выше оператора SQL также влияет на такие строки, как «NIKE SHOES», которые станут «NIKE’SHOES», что мне, очевидно, не нравится.
Есть ли способ ограничить функцию replace (или есть другой способ сделать это), чтобы я мог получить желаемый результат? Буква «S» обычно находится в конце строки для большинства моих данных, которые, я надеюсь, будут полезны.
Комментарии:
1. всегда ли ‘s’ следует за числом?
Ответ №1:
Вы могли бы ограничить это подмножеством, более близким к вашим потребностям, поместив предложение WHERE с РЕГУЛЯРНЫМ выражением ():
UPDATE products SET prodname = REPLACE(prodname, " S", "'S") WHERE prodname REGEXP '[0-9]sS'
Это соответствует строкам с названиями продуктов, которые имеют номер, за которым следует пробел, за которым следует буква S. К сожалению, в MySQL по умолчанию не реализована замена регулярных выражений, чтобы можно было заменить только это совпадение, так что это также заменит «TYLENOL TAB SOLO 100 S» на «TYLENOL TAB’SOLO 100 S», но это не заменит в вашем исходном «TYLENOL TABS 100 S»
Комментарии:
1. Я не очень уверен, что ваш ответ решает проблему, поскольку вы сказали, что по умолчанию регулярное выражение не заменяется?
2. Действительно, нет замены РЕГУЛЯРНОГО ВЫРАЖЕНИЯ, но оно обновляет только записи, которые имеют значения в виде ‘числового пробела S’
Ответ №2:
Вы могли бы попробовать:
UPDATE products SET prodname = REPLACE(prodname, " S", "'S")
WHERE prodname LIKE "% S"
Это означает, что продукты с prodname
окончанием на S будут обновлены. %
Символ означает что угодно.
Комментарии:
1. это все равно заменит слишком много при выполнении критериев where, как это было бы в случае с
tylenol something 100 S
, в результате чего вы получитеtylenol'something 100'S
2. @andyuyboco Добро пожаловать! Однако @Nathan gonzalez прав, следите за
prodname
лайкамиTYLENOL S-WORDS 100 S
.3. Да, я выяснил это на собственном горьком опыте. Но в любом случае, я весело провожу время, исправляя это.
4. это работает точно так же, как и раньше 🙂 — он также заменяет «TYLENOL S-WORDS»
5. @andyuyboco Верните «TYLENOL S-WORDS» с помощью
UPDATE products SET prodname = REPLACE(prodname, "'S", " S") WHERE prodname LIKE "%'S_%"
Ответ №3:
Если вы хотите, чтобы строка prodname
заканчивалась на S
, вы также можете использовать:
UPDATE products SET prodname = CONCAT(SUBSTR(prodname,1,CHAR_LENGTH(prodname)-2),"'S")
WHERE prodname LIKE "% S"
Это заменило бы не TYLENOL SOMETHING 100 S
на TYLENOL 'SOMETHING 100'S
, а на TYLENOL SOMETHING 100'S
. %
Символ означает что угодно, как и другие ответы на данный момент.
Комментарии:
1. К сожалению, это произошло слишком поздно. :p Я буду иметь это в виду в следующий раз, когда мне это понадобится.
2. что, если название продукта «TYLENOL SOMETHING 100 S BEST EVER»?
3. @Tudor Ты прав, но я начал свой ответ с этого. Причина, по которой я дал этот ответ, заключалась в том, что я читал:
The " S" is usually at the tail end of the string for most of my data, which I'm hoping will be helpful.