我对MYSQL中的格式化数据有疑问。
这就是我的表格的样子
Table Movie
ID Movie Cast
1 Movie1 Actor1(Role1), Actor2(Role2), Actor3(Role3)
2 Movie2 Actor2(Role4), Actor3(Role1)
3 Movie3 Actor3(Role7), Actor5(Role9), Actor2(Role4)
我知道在一个字段中有多个值是糟糕的数据库设计,我也在努力分离这些值。
任何人都可以帮我删除Cast中的(角色)吗? 有没有检查“(”和“)”并删除括号之间的所有字符?
感谢您的帮助!
答案 0 :(得分:2)
答案 1 :(得分:1)
如果你调整括号而不是括号,这个SQL函数可以让你从a user comment in mysql's manual开始。
delimiter ||
DROP FUNCTION IF EXISTS strip_tags||
CREATE FUNCTION strip_tags( x longtext) RETURNS longtext LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA
BEGIN
DECLARE sstart INT UNSIGNED;
DECLARE ends INT UNSIGNED;
SET sstart = LOCATE('<', x, 1);
REPEAT
SET ends = LOCATE('>', x, sstart);
SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ;
SET sstart = LOCATE('<', x, 1);
UNTIL sstart < 1 END REPEAT;
return x;
END;
||
delimiter ;
mysql> SELECT strip_tags('<a href="HelloWorld.html"><B>Hi, mate!</B></a>') as strip_tags;
+------------+`
| strip_tags |`
+------------+`
| Hi, mate! |
+------------+
答案 2 :(得分:0)
您还可以运行此查询3次,它将删除3个括号及其中的内容。
我可以把它变成一个查询,但我认为它会太长而且修改起来会更难(容易出错)
UPDATE table_name SET cast=REPLACE( cast , SUBSTRING(cast, LOCATE("(", cast) , ( LOCATE(")", cast) - LOCATE("(", cast) +1 )) , "" ) ;
如果您拆分查询,则会看到:
我们得到开括号和右括号之间的字符长度,+1表示包括右括号)
( LOCATE(")", cast) - LOCATE("(", cast) +1 )
在这里,我们从第一次出现时开始选择演员专栏中的文字(长度取自片段上方的行。
SUBSTRING(cast, LOCATE("(", cast) , ( LOCATE(")", cast) - LOCATE("(", cast) +1 ))
最后我们使用REPLACE函数,它将前一行的结果作为参数。
这里记录了所有这些功能:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace