从名称列生成slug名称列的简便方法?

mei*_*ryo 6 mysql sql

db_products 表:

| ID | Name         |
| 40 | Foo Bar!~~~~ |
Run Code Online (Sandbox Code Playgroud)

我想生成一个slug名称列:

| ID | Name         | Slug_Name |
| 40 | Foo Bar!~~~~ | foo-bar   |
Run Code Online (Sandbox Code Playgroud)

这可以通过SQL实际完成吗?或者我需要使用不同的语言编写脚本吗?

编辑:我使用此函数在PHP中生成slug:

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;
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我的SQL技能相当基本.

ALTER TABLE db_products ADD Slug_Name VARCHAR

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

Erw*_*wan 8

这是一个简单的解决方案,只需一个查询:

UPDATE `my_table` SET alias = lower(name),
alias = replace(alias, '.', ' '),
alias = replace(alias, '\'', '-'),
alias = replace(alias,'š','s'),
alias = replace(alias,'Ð','Dj'),
alias = replace(alias,'ž','z'),
alias = replace(alias,'Þ','B'),
alias = replace(alias,'ß','Ss'),
alias = replace(alias,'à','a'),
alias = replace(alias,'á','a'),
alias = replace(alias,'â','a'),
alias = replace(alias,'ã','a'),
alias = replace(alias,'ä','a'),
alias = replace(alias,'å','a'),
alias = replace(alias,'æ','a'),
alias = replace(alias,'ç','c'),
alias = replace(alias,'è','e'),
alias = replace(alias,'é','e'),
alias = replace(alias,'ê','e'),
alias = replace(alias,'ë','e'),
alias = replace(alias,'ì','i'),
alias = replace(alias,'í','i'),
alias = replace(alias,'î','i'),
alias = replace(alias,'ï','i'),
alias = replace(alias,'ð','o'),
alias = replace(alias,'ñ','n'),
alias = replace(alias,'ò','o'),
alias = replace(alias,'ó','o'),
alias = replace(alias,'ô','o'),
alias = replace(alias,'õ','o'),
alias = replace(alias,'ö','o'),
alias = replace(alias,'ø','o'),
alias = replace(alias,'ù','u'),
alias = replace(alias,'ú','u'),
alias = replace(alias,'û','u'),
alias = replace(alias,'ý','y'),
alias = replace(alias,'ý','y'),
alias = replace(alias,'þ','b'),
alias = replace(alias,'ÿ','y'),
alias = replace(alias,'ƒ','f'),
alias = replace(alias, 'œ', 'oe'),
alias = replace(alias, '€', 'euro'),
alias = replace(alias, '$', 'dollars'),
alias = replace(alias, '£', ''),
alias = trim(alias),
alias = replace(alias, ' ', '-'),
alias = replace(alias, '--', '-') ;
Run Code Online (Sandbox Code Playgroud)

在这个例子中:

  • 'my_table'是表的名称,
  • 'name'是原始字段
  • 'alias'是我的slug字段的名称

希望能帮助到你 !


小智 4

您当然可以使用 MySQL 进行字符串替换。官方文档列出了很多您可能会觉得有用的字符串函数。

\n\n
SELECT REPLACE(\'Foo Bar!~~~~\', \'~\', \'\');\nSELECT LOWER(\'Foo Bar!\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

我也看到了这篇博文关于在 MySQL 中使用正则表达式的

\n\n

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

\n\n

所以我建议创建一个函数来执行正则表达式替换:

\n\n
DELIMITER $$\nFUNCTION `regex_replace`(pattern varchar(1000),replacement varchar(1000),original varchar(1000))\nRETURNS varchar(1000)\nDETERMINISTIC\nBEGIN\nDECLARE temp VARCHAR(1000);\nDECLARE ch VARCHAR(1);\nDECLARE i INT;\nSET i = 1;\nSET temp = original;\nIF original REGEXP pattern THEN\n    SET temp = "";\n    loop_label: LOOP\n    IF i>CHAR_LENGTH(original) THEN\n        LEAVE loop_label;\n    END IF;\n    SET ch = SUBSTRING(original,i,1);\n    IF NOT ch REGEXP pattern THEN\n        SET temp = CONCAT(temp,ch);\n    ELSE\n        SET temp = CONCAT(temp,replacement);\n    END IF;\n    SET i=i+1;\nEND LOOP;\nEND IF;\nRETURN temp;\nEND$$\nDELIMITER ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后类似于以下内容

\n\n
SELECT regex_replace(\'[^a-zA-Z0-9]+\', \'\', \'%$&?/\xe2\x80\x99|test><+-,][)(\' )\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
update db_products set Slug_Name = replace(Name, \'~\', \'\');\n
Run Code Online (Sandbox Code Playgroud)\n