Как обновить значение подстрокой текущего значения с помощью SQL

#mysql #sql

#mysql #sql

Вопрос:

В моей таблице местоположений некоторые названия городов содержат почтовые индексы. Я хочу удалить почтовый индекс. Почтовые индексы (если есть) присутствуют справа от названия города. (Я использую MySQL)

Я могу выбрать все такие города с помощью этого запроса:

 SELECT name FROM location where name REGEXP '[0-9]$';
  

Он отображает:

 Lahore-54000
Karachi-75000
Islamabad-87544
  

Теперь я хочу обновить столбец name, удалив почтовые индексы.
Как я могу составить запрос на обновление?

Комментарии:

1. Во-первых, это хорошее предложение, спасибо. Во-вторых: это не проблема дизайна БД, на самом деле я получил некоторые текстовые файлы данных, которые мне нужно поместить в рациональную структуру. Рассматриваемый пример предназначен только для уточнения проблемы, реальный случай сильно отличается. Но нет необходимости обсуждать эти детали, и это затруднило бы понимание вопросов.

Ответ №1:

Часть 1

Попробуйте это —

 UPDATE location
SET
  name = LEFT(name, LENGTH(SUBSTRING_INDEX(name, '-', -1))   1)
WHERE
  name REGEXP '[0-9]$';
  

Часть 2

Дополнительная функция:

 DELIMITER $$

CREATE FUNCTION mytrim(input_string VARCHAR(255))
RETURNS VARCHAR(255) CHARSET utf8
BEGIN
  SET @pos = NULL;
  SET @len = length(input_string);
  SET @i = @len;

  WHILE @i > 0
  DO
    SET @c = substring(input_string, @i, 1);
    IF (ascii(@c) > 47 AND ascii(@c) < 58) OR @c = '-' THEN
      SET @pos = @i;
    ELSE
      SET @i = -1;
    END IF;

    SET @i = @i - 1;
  END WHILE;

  RETURN if(@pos IS NULL, input_string, substring(input_string, 1, @pos - 1));
END
$$

DELIMITER ;
  

Примеры:

 SET @n1 = "564, garden-block, Karachi-75000";
SET @n2 = "55, abc-block, Karachi 75870";
SELECT mytrim(@n1), mytrim(@n2);
 ---------------------------- ------------------------- 
| mytrim(@n1)                | mytrim(@n2)             |
 ---------------------------- ------------------------- 
| 564, garden-block, Karachi | 55, abc-block, Karachi  |
 ---------------------------- ------------------------- 
  

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

 UPDATE location
SET
  name = mytrim(name)
WHERE
  name REGEXP '[0-9]$';
  

Комментарии:

1. после изменения от -1 до 1 это работает. предполагается, что есть только один «-«. но в моем случае в названии города есть несколько «-» (фактически это полный адрес). есть также некоторые почтовые индексы, которые не имеют префикса «-«. поэтому вместо использования «-» мне нужен какой-то механизм для фильтрации по ‘[0-9] $’. еще пример данных … «564, garden-block, Карачи-75000» «55, abc-block, Карачи 75870»