db_products 桌子:
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中遍历每一行并进行设置?
Slug_Name = toSlug(Name)
您当然可以使用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, '~', '');