一尘不染

从名称列生成子弹名称列的简单方法?

sql

db_products 桌子:

| ID | Name         |
| 40 | Foo Bar!~~~~ |

我想生成一个子弹名称列:

| ID | Name         | Slug_Name |
| 40 | Foo Bar!~~~~ | foo-bar   |

可以通过SQL实际完成吗?还是我需要使用其他语言编写脚本?

编辑:我正在使用此函数在PHP中生成段塞:

function toSlug($string,$space="-") {
    if (function_exists('iconv')) {
        $string = @iconv('UTF-8', 'ASCII//TRANSLIT', $string);
    }
    $string = preg_replace("/[^a-zA-Z0-9 -]/", "", $string);
    $string = strtolower($string);
    $string = str_replace(" ", $space, $string);
    return $string;
}

到目前为止,我的SQL技能还很基本。

ALTER TABLE db_products ADD Slug_Name VARCHAR

如何Slug_Name = toSlug(Name)在SQL中遍历每一行并进行设置?


阅读 161

收藏
2021-03-10

共1个答案

一尘不染

您当然可以使用MySQL进行字符串替换。在官方文件列出相当多的字符串函数您可能会发现有用的。

SELECT REPLACE('Foo Bar!~~~~', '~', '');
SELECT LOWER('Foo Bar!');

我还浏览了有关在MySQL中使用正则表达式的博客文章

更新:我提到的博客文章的详细信息:

因此,我建议创建一个用于执行正则表达式替换的函数:

DELIMITER $$
FUNCTION `regex_replace`(pattern varchar(1000),replacement varchar(1000),original varchar(1000))
RETURNS varchar(1000)
DETERMINISTIC
BEGIN
DECLARE temp VARCHAR(1000);
DECLARE ch VARCHAR(1);
DECLARE i INT;
SET i = 1;
SET temp = original;
IF original REGEXP pattern THEN
    SET temp = "";
    loop_label: LOOP
    IF i>CHAR_LENGTH(original) THEN
        LEAVE loop_label;
    END IF;
    SET ch = SUBSTRING(original,i,1);
    IF NOT ch REGEXP pattern THEN
        SET temp = CONCAT(temp,ch);
    ELSE
        SET temp = CONCAT(temp,replacement);
    END IF;
    SET i=i+1;
END LOOP;
END IF;
RETURN temp;
END$$
DELIMITER ;

然后类似于以下内容

SELECT regex_replace('[^a-zA-Z0-9]+', '', '%$&?/鈥檤test><+-,][)(' )

如果您对这种方法不满意,则始终可以使用replace运行一些更新调用

update db_products set Slug_Name = replace(Name, '~', '');
2021-03-10