如何使用SQL使用当前值的子字符串更新值

时间:2011-04-13 11:07:01

标签: mysql sql

在我的位置表中,某些城市名​​称包含邮政编码。我想删除邮政编码。邮政编码(如果有)出现在城市名称的右侧。 (我正在使用MySQL)

我可以使用此查询选择所有此类城市:

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

显示:

Lahore-54000
Karachi-75000
Islamabad-87544

现在,我想更新已删除邮政编码的名称列。
我如何撰写更新查询?

1 个答案:

答案 0 :(得分:5)

<强>第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]$';