2016-05-14 20 views
0

我有一个数据库,其中包含的列完全包含指向播客音频文件的URL。几乎所有的格式都是http://abcdefgh.abcd.ca/podcasting/audio/YYYYMMDD-HHMMSS-to-YYYMMDD-HHMMSS.mp3需要根据列的内容更改单列中的很多值

问题是我们现在在/ audio /文件夹中有很多文件,需要很长时间才能在Windows资源管理器中加载该文件夹。因此,我们希望将它们全部移到文件夹中,例如http://abcdefgh.abcd.ca/podcasting/audio/20060321-140000-to-20000321-150000.mp3被移动到http://abcdefgh.abcd.ca/podcasting/audio/2006/20060321-140000-to-20000321-150000.mp3,我们必须更新数据库中的所有URL以反映新的文件夹结构。我们有从2006年到2015年这个命名约定的文件,并且在2015年9月左右我们进行了切换,以便所有新播客自动使用年份文件夹结构并且不需要更新。

我对SQL不太熟悉 - 这是我工作的一部分,但在聘用时很“高兴”。反正我的尝试是这样的:

/*urls are in structure of = 'http://abcdefgh.abcd.ca/audio/YYYYMMDD-HHMMSS-to-YYYYMMDD-HHMMSS.mp3 but then some aren't in this format which we ignore. All urls are in the column of the table named "url"*/ 
UPDATE table.podcast_episodes 
SET url = CASE 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2006____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2006/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2007____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2007/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2008____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2008/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2009____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2009/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2010____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2010/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2011____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2010/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2012____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2011/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2013____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2012/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2014____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2014/',substring(url FROM 42)) 
    WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2015____-______-to-%.mp3' THEN url = concat(substring(url,1,41),'2015/',substring(url FROM 42)) 
    /* do nothing */ 
    ELSE url= url 
END 

它的问题是它只是设置的URL字段为0时,它的case语句相匹配,或1当它击中了“其他”的声明,这是不是我想。

+0

好吧,它在做什么,它有什么问题?请问一个问题。 – ChiefTwoPencils

+0

我编辑了我原来的帖子。我包括: “问题在于它只是在匹配case语句时将URL字段设置为0,或者在匹配”else“语句时设置为1,这不是我想要的。” – Scott

+0

当然“这不是我工作的一部分,但是......”? – Strawberry

回答

0

如果这是一次性工作,则不需要使用SQL。你可以转储表:

mysqldump -u user -p database table > dump.sql 

使文本替换:

sed -i 's|\(http://abcdefgh.abcd.ca/podcasting/audio/\)\([0-9]\{4\}\)\([-to0-9]*\.mp3\)|\1\2/\2\3|g' dump.sql 

,并导入表背:

mysqlimport -u user -p database table < dump.sql 

这些命令是为Linux/Unix的。如果你在Windows上,你可以使用你最喜欢的工具。

+0

是的,这是一次性工作。谢谢。 – Scott

+0

你的sed命令是错误的? (podcasting/audio /)([0-9] {4})([to-0-9] * \。mp3)| $ 1 $ 2/$ 2 $ 3 | g'dump.sql sed:-e表达式#1,字符59:无效范围结束 – Scott

+0

没关系,我不得不将“podcasting/audio”更改为完整的url – Scott

1

因为您没有正确使用您的ELSE或CASE语句。格式是

CASE WHEN url LIKE ... THEN (the concatenated value that you're setting url to). 

你不这样做

THEN url = (concatenated value you're creating) 

,因为它会失败,你看到它失败的方式。如果你做了这样的细微修改:

UPDATE podcast_episodes 
SET url = CASE 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2006____-______-to-%.mp3' THEN concat(substring(url,1,41),'2006/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2007____-______-to-%.mp3' THEN concat(substring(url,1,41),'2007/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2008____-______-to-%.mp3' THEN concat(substring(url,1,41),'2008/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2009____-______-to-%.mp3' THEN concat(substring(url,1,41),'2009/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2010____-______-to-%.mp3' THEN concat(substring(url,1,41),'2010/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2011____-______-to-%.mp3' THEN concat(substring(url,1,41),'2010/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2012____-______-to-%.mp3' THEN concat(substring(url,1,41),'2011/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2013____-______-to-%.mp3' THEN concat(substring(url,1,41),'2012/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2014____-______-to-%.mp3' THEN concat(substring(url,1,41),'2014/',substring(url FROM 42)) 
WHEN url LIKE 'http://abcdefgh.abcd.ca/podcasting/audio/2015____-______-to-%.mp3' THEN concat(substring(url,1,41),'2015/',substring(url FROM 42)) 
/* do nothing */ 
ELSE url 
END 

然后它应该工作。 Here's a SQL fiddle to show the difference

+0

这是对的。 CASE表达式返回一个*值*。 'CASE ... ELSE url = url END'不*执行任务。表达式'url = url'被评估为一个值...比较操作的结果。如果比较结果为TRUE,则MySQL返回一个*值*为1. +10。 – spencer7593

相关问题